!!!如有转载 请注明出处!!!
主要功能介绍:
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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#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]!='\0';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!='\0')
{
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!='\0')
{
if(*p>='9' && *p<='0'