!!!如有转载 请注明出处!!!
主要功能介绍:
1、输入函数的解析式,可以在窗口中画出解析式的函数图像。
2、解析式只能以x为自变量。
3、解析式目前只能写数字、括号、加减乘除四则运算(±*/),不能写乘方、开方、各种函数(三角函数、对数等等)。
4、输入解析式时,程序禁用中文输入法,也不能输入中文括号。.
5、输入解析式语法错误时,程序弹出对话框并告知哪里有错误,允许重新输入。
6、输入解析式的窗口在任务栏不显示。
7、输入解析式的窗口一旦打开,主窗口就不响应任何操作,直到输入解析式的窗口关闭。关闭以后,主窗口重画所有函数图像和x、y轴。
8、x、y轴为黑色,图像红色。
环境:
Windows10 64位,MinGW-POSIX-64位。
注:
1、若为32位系统,据说需要将SetWindowLongPtr换为SetWindowLong,里面参数GWLP_WNDPROC需要换为GWL_WNDPROC(我也没试过,所以不能那么肯定。大家可以自己试一试)
2、如果编译不通过,在makefile.bat中编译可执行文件的一行手动链接pthread库。
3、如果报错不支持WinMain函数入口,可以百度下载msys64(大概就是这么一个东西)来支持win32应用程序,至于如何安装百度都有,这里不赘述。
截图:
代码如下:
//libtranslateexpression.c #include#include #include #include #include #define SGR_MAX_EXPR 1024 #define CHECKFUNC_NO_ERROR 0x00 #define CHECKFUNC_FOUND_TIMEADDBR 0x01 #define CHECKFUNC_FOUND_TIMESUBBR 0x02 #define CHECKFUNC_FOUND_DIVADDBR 0x03 #define CHECKFUNC_FOUND_DIVSUBBR 0x04 #define CHECKFUNC_BRACKET_ERROR 0x05 #define CHECKFUNC_NONUMBERAFTERSIGN 0x06 #define CHECKFUNC_NONUMBERBEFORESIGN 0x07 #define CHECKFUNC_DECIMALPOINT_ERROR 0x08 #define CHECKFUNC_VARIBLEHASNOSIGN 0x09 BOOL CheckFuncExpr(const char* expr) { if(strstr(expr,"*+(")!=NULL) return CHECKFUNC_FOUND_TIMEADDBR; if(strstr(expr,"*-(")!=NULL) return CHECKFUNC_FOUND_TIMESUBBR; if(strstr(expr,"/+(")!=NULL) return CHECKFUNC_FOUND_DIVADDBR; if(strstr(expr,"/-(")!=NULL) return CHECKFUNC_FOUND_DIVSUBBR; int i=0,bracket=0; for(;expr[i]!=' ';i++) { if(expr[i]=='(') bracket++; if(expr[i]==')') bracket--; if(bracket<0) return CHECKFUNC_BRACKET_ERROR; if(expr[i]=='+' || expr[i]=='-') { if(expr[i+1]!='(' && expr[i+1]>'9' && expr[i+1]<'0' && expr[i+1]!='x') return CHECKFUNC_NONUMBERAFTERSIGN; } if(expr[i]=='*' || expr[i]=='/') { if(i==0) return CHECKFUNC_NONUMBERBEFORESIGN; if(expr[i+1]!='(' && expr[i+1]>'9' && expr[i+1]<'0' && expr[i+1]!='x') return CHECKFUNC_NONUMBERAFTERSIGN; if(expr[i-1]!='(' && expr[i-1]>'9' && expr[i-1]<'0' && expr[i-1]!='x') return CHECKFUNC_NONUMBERBEFORESIGN; } if(expr[i]=='.') { if(expr[i+1]<'0' && expr[i+1]>'9') return CHECKFUNC_DECIMALPOINT_ERROR; if(expr[i-1]<'0' && expr[i-1]>'9') return CHECKFUNC_DECIMALPOINT_ERROR; } if(expr[i]=='x') { if((expr[i+1]>'0' && expr[i+1]<'9') || expr[i+1]=='.') return CHECKFUNC_VARIBLEHASNOSIGN; if(i!=0) if((expr[i-1]>'0' && expr[i-1]<'9') || expr[i-1]=='.') return CHECKFUNC_VARIBLEHASNOSIGN; } } if(bracket!=0) return CHECKFUNC_BRACKET_ERROR; return CHECKFUNC_NO_ERROR; } BOOL CheckNum(double x) { switch(fpclassify(x)) { case FP_ZERO:return TRUE; case FP_NORMAL:return TRUE; default:return FALSE; } } void ReplaceAddSign(char* expr,char*out) { memset(out,0,sizeof(char)*SGR_MAX_EXPR); char *k=expr; char *p=out; if(*expr!='+' && *expr!='-') { *p='+';p++; *p=*k; } while(*k!=' ') { if(*k!='+' && *k!='-') { *p=*k;p++;k++; } else { if(*(k-1)!='+' && *(k-1)!='-')*p=*k; if(*k=='-' && (*(k-1)=='+' || *(k-1)=='-'))*p=(*p=='+')?'-':'+'; if(*(k+1)!='+' && *(k+1)!='-')p++; k++; } } p=out; while(*p!=' ') { if(*p>='9' && *p<='0' && *p!='.' && *(p+1)=='+') memmove(p+1,p+2,strlen(p+2)+1); p++; } } double GetResult_addsub(char* expr) { double a=0,b=0; char* p=expr; if(*p=='+' ||*p=='-')p++; sscanf(p,"%lf",&a); if(*(p-1)=='-')a=-a; while(1) { while(*p!='+' && *p!='-') { p++; if(*p==0)break; } if(sscanf(++p,"%lf",&b)==0)break; switch(*(p-1)) { case '+':a+=b;break; case '-':a-=b;break; } } return a; } double GetResult_timediv(char* expr) { double a=0,b=0; char* p=expr; sscanf(p,"%lf",&a); while(1) { while(*p!='/' && *p!='*') { p++; if(*p==0)break; } if(sscanf(++p,"%lf",&b)<=0)break; switch(*(p-1)) { case '*':a*=b;break; case '/':a/=b;break; case '-': switch(*(p-2)) { case '*':a*=-b;break; case '/':a/=-b;break; } break; } } return a; } void gettimedivexpr(const char*expr,char*out) { for(int i=0;expr[i]!=' ';i++) { if(((expr[i]>='0' && expr[i]<='9') || expr[i]=='.' || expr[i]=='*' || expr[i]=='/') || (expr[i]=='-' && (expr[i-1]=='*' || expr[i-1]=='/')))out[i]=expr[i]; else break; } } double nonebracket_Translateexpression(char*expr) { char RepAS[SGR_MAX_EXPR]={0}; ReplaceAddSign(expr,RepAS); char*p=RepAS; char**p_sep; double a=0; double res[SGR_MAX_EXPR/2]={0.0}; int n=0,i; char**sep=(char**)malloc(SGR_MAX_EXPR/2*sizeof(char*)); for(i=0;i


