!!!如有转载 请注明出处!!!

主要功能介绍:
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      0x09BOOL 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' && *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]!='\0';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<SGR_MAX_EXPR/2;i++){sep[i]=(char*)malloc(SGR_MAX_EXPR*sizeof(char));memset(sep[i],0,sizeof(char)*SGR_MAX_EXPR);}for(p_sep=sep;*p!='\0';n++,p_sep++){sscanf(p++,"%c",*p_sep);gettimedivexpr(p,(*p_sep)+1);p+=strlen((*p_sep)+1);}for(p_sep=sep;**p_sep!='\0';p_sep++)res[p_sep-sep]=GetResult_timediv(*p_sep+1);for(p_sep=sep;**p_sep!='\0';p_sep++)res[p_sep-sep]*=(**p_sep=='+')?(1):(-1);for(p_sep=sep;**p_sep!='\0';p_sep++)a+=res[p_sep-sep]; for(i=0;i<SGR_MAX_EXPR/2;i++){free(sep[i]);sep[i]=NULL;}free(sep);sep=NULL;return a;
}UINT getbracketstep(char*expr)
{UINT bracket=0;UINT mostbracket=0;UINT i=0;for(;expr[i]!='\0';i++){switch(expr[i]){case '(':bracket++;if(mostbracket<bracket)mostbracket=bracket;break;case ')':bracket--;break;}}return mostbracket;
}void exprbracketpos(char*expr,UINT bracketstep,char**out)
{UINT i=0;UINT bracket=0;UINT p=0;for(;expr[i]!='\0';i++){switch(expr[i]){case '(':bracket++;break;case ')':bracket--;if(bracket==bracketstep-1)    p++;break;}if(bracket==bracketstep)out[p][strlen(out[p])]=expr[i];}
}double TranslateExpression(char*expr)
{UINT mostbracket=getbracketstep(expr);if(mostbracket==0)return nonebracket_TranslateExpression(expr);int bracket=0;int i=0;char decomp[SGR_MAX_EXPR]={'\0'};char laststr[SGR_MAX_EXPR]={'\0'};for(;expr[i]!='\0';i++){if(expr[i]==')'){bracket--;if(bracket==0){sprintf(laststr+strlen(laststr),"%lf",TranslateExpression(decomp));memset(decomp,0,strlen(decomp));continue;}}if(bracket>=1)decomp[strlen(decomp)]=expr[i];if(expr[i]=='('){bracket++;}if(bracket==0)laststr[strlen(laststr)]=expr[i];}return nonebracket_TranslateExpression(laststr);
}double GetIndependent(char*func,char indep,double volue)
{char expr[SGR_MAX_EXPR]={'\0'};for(int i=0;func[i]!='\0';i++){if(func[i]==indep)sprintf(expr+strlen(expr),"%lf",volue);elseexpr[strlen(expr)]=func[i];}return TranslateExpression(expr);
}

这是一个库的代码,具体就是表达式求值功能。

还有def文件(libtranslateexpression.def):

LIBRARY libtranslateexpression.dll
EXPORTSCheckFuncExpr        @1CheckNum         @2 TranslateExpression @3GetIndependent       @4

接下来是exe文件的代码:

#include <windows.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>#define HMENU_PAINT_FUNC 1#define HMENU_func_TEXTFX 2
#define HMENU_func_EDITFX 3
#define HMENU_func_BUTTONOKAY 4
#define HMENU_func_BUTTONCANCEL 5#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      0x09BOOL CheckFuncExpr(const char*expr);
BOOL CheckNum(double x);
double GetIndependent(char*func,char indep,double volue);char functions[64][SGR_MAX_EXPR]={{0}};
int funcnum=0;void paintfunc(int enlarge,HWND hwnd)
{static PAINTSTRUCT ps;static HPEN hpen;static RECT rect;static HDC hdc;hdc=BeginPaint(hwnd,&ps);hpen=CreatePen(PS_SOLID,1,RGB(255,0,0));GetClientRect(hwnd,&rect);SelectObject(hdc,hpen);static int i;static int j;static BOOL paint;static double y;for(j=0;j<funcnum;j++){for(i=-rect.right/2;i<rect.right/2;i++){y=GetIndependent(functions[j],'x',(double)(i)/enlarge);if(CheckNum(y)){MoveToEx(hdc,rect.right/2+i,rect.bottom/2-y*enlarge,NULL);break;}}for(paint=TRUE;i<(rect.right-rect.left)/2;i++){y=GetIndependent(functions[j],'x',(double)(i)/enlarge);if(CheckNum(y)){if(paint==TRUE)LineTo(hdc,rect.right/2+i,rect.bottom/2-y*enlarge);else{MoveToEx(hdc,rect.right/2+i,rect.bottom/2-y*enlarge,NULL);paint=TRUE;}}else  paint=FALSE;}}for(i=0;i<rect.right;i++)  SetPixel(hdc,i,rect.bottom/2,RGB(0,0,0));for(i=0;i<rect.bottom;i++)   SetPixel(hdc,rect.right/2,i,RGB(0,0,0));DeleteObject(hpen);EndPaint(hwnd,&ps);
}HINSTANCE hInst;BOOL NEWWINDOWEXISTS=FALSE;
BOOL MAINWINDOW_RESP=TRUE;
RECT MAINWINDOW_RECT;pthread_t FuncInput_pth;HWND FuncInput_hwnd;
HWND Main_hwnd;WNDPROC func_hEDITfx_old_WndProc;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK func_WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK func_hEDITfx_WndProc(HWND,UINT,WPARAM,LPARAM);BOOL CreateFuncInputWindow(HWND hwnd)
{static TCHAR szAppName[]=TEXT("MathPaint_FuncInput");MSG msg;WNDCLASS wndclass;wndclass.lpfnWndProc=func_WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInst;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)CreateSolidBrush(RGB(240,240,240));wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;RegisterClass(&wndclass);hwnd=CreateWindow(szAppName,TEXT("绘制新函数..."),WS_BORDER|WS_CAPTION|WS_VISIBLE|WS_SYSMENU|WS_POPUP|WS_CHILD,(MAINWINDOW_RECT.left+MAINWINDOW_RECT.right)/2-200,(MAINWINDOW_RECT.top+MAINWINDOW_RECT.bottom)/2-100,400,200,Main_hwnd,NULL,hInst,NULL);ShowWindow(hwnd,SW_SHOW);UpdateWindow(hwnd);while(GetMessage(&msg,hwnd,0,0)>0){TranslateMessage(&msg);DispatchMessage(&msg);Sleep(50);}return msg.wParam;
}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{ ShowWindow(GetForegroundWindow(),SW_HIDE);DestroyWindow(GetForegroundWindow());static TCHAR szAppName[]=TEXT("MathPaint");HWND hwnd;MSG msg;WNDCLASS wndclass;hInst=hInstance;wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName; RegisterClass(&wndclass);Main_hwnd=hwnd=CreateWindow(szAppName,TEXT("MathPaint"),WS_MAXIMIZE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,SW_SHOW);UpdateWindow(hwnd);while(GetMessage(&msg,hwnd,0,0)>0){if(MAINWINDOW_RESP==FALSE && NEWWINDOWEXISTS==FALSE){NEWWINDOWEXISTS=TRUE;pthread_create(&FuncInput_pth,NULL,(void*)CreateFuncInputWindow,FuncInput_hwnd);}TranslateMessage(&msg);DispatchMessage(&msg);Sleep(50);}return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{static HMENU hmenu_paint;static HMENU hmenu_paint_func;if(MAINWINDOW_RESP==TRUE){EnableMenuItem(hmenu_paint,0,MF_BYPOSITION|MF_ENABLED);switch(message) { case WM_CREATE: GetWindowRect(hwnd,&MAINWINDOW_RECT);hmenu_paint=CreateMenu();hmenu_paint_func=CreateMenu();AppendMenu(hmenu_paint_func,MF_ENABLED|MF_STRING,HMENU_PAINT_FUNC,TEXT("绘制新函数..."));AppendMenu(hmenu_paint,MF_ENABLED|MF_STRING|MF_POPUP,(UINT_PTR)hmenu_paint_func,TEXT("作图(p)"));SetMenu(hwnd,hmenu_paint);return 0;case WM_COMMAND:switch(LOWORD(wParam)){case HMENU_PAINT_FUNC:MAINWINDOW_RESP=FALSE;EnableMenuItem(hmenu_paint,0,MF_BYPOSITION|MF_GRAYED);return 0;}return 0;case WM_PAINT:GetWindowRect(hwnd,&MAINWINDOW_RECT);break;}}else{switch(message){case WM_CLOSE:return 0;case WM_MOVE:MoveWindow(hwnd,MAINWINDOW_RECT.left,MAINWINDOW_RECT.top,MAINWINDOW_RECT.right-MAINWINDOW_RECT.left,MAINWINDOW_RECT.bottom-MAINWINDOW_RECT.top,TRUE);return 0;}}switch(message){case WM_PAINT:paintfunc(50,hwnd);break;}return DefWindowProc(hwnd,message,wParam,lParam);
}LRESULT CALLBACK func_hEDITfx_WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{ImmAssociateContext(hwnd,NULL);switch(message){case WM_CHAR:switch(wParam){case '(':break;case ')':break;case 'x':break;case '+':break;case '-':break;case '*':break;case '/':break;case 8:break;default:if(wParam>='0' && wParam<='9') break;else return 0;}break;case WM_PASTE:return 0;}return func_hEDITfx_old_WndProc(hwnd,message,wParam,lParam);
}LRESULT CALLBACK func_WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{static RECT rect;static HWND hTEXTfx;static HWND hEDITfx;static HWND hBUTTONokay;static HWND hBUTTONcancel;static HFONT hfont;static int width;static int height;static char FuncExpr[SGR_MAX_EXPR];switch(message){case WM_CREATE:GetClientRect(hwnd,&rect);width=rect.right-rect.left;height=rect.bottom-rect.top;hfont=CreateFont(-15,-7.5,0,0,400,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,FF_DONTCARE,TEXT("微软雅黑"));hTEXTfx=CreateWindow(TEXT("static"),TEXT("y="),WS_CHILD|WS_VISIBLE|SS_CENTERIMAGE|SS_LEFT,width/16,height/8,width/4,height/8,hwnd,(HMENU)HMENU_func_TEXTFX,hInst,NULL);hEDITfx=CreateWindow(TEXT("edit"),TEXT(""),WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOVSCROLL|ES_MULTILINE,width/16,height/4,width/2,height/2,hwnd,(HMENU)HMENU_func_EDITFX,hInst,NULL);hBUTTONcancel=CreateWindow(TEXT("button"),TEXT("取消"),WS_CHILD|WS_VISIBLE|WS_BORDER|BS_CENTER,width*11/16,height/8,width/4,height*3/10,hwnd,(HMENU)HMENU_func_BUTTONCANCEL,hInst,NULL);hBUTTONokay=CreateWindow(TEXT("button"),TEXT("确定"),WS_CHILD|WS_VISIBLE|WS_BORDER|BS_CENTER,width*11/16,height*23/40,width/4,height*3/10,hwnd,(HMENU)HMENU_func_BUTTONOKAY,hInst,NULL);SendMessage(hTEXTfx,WM_SETFONT,(WPARAM)hfont,(LPARAM)NULL);SendMessage(hEDITfx,WM_SETFONT,(WPARAM)hfont,(LPARAM)NULL);SendMessage(hBUTTONcancel,WM_SETFONT,(WPARAM)hfont,(LPARAM)NULL);SendMessage(hBUTTONokay,WM_SETFONT,(WPARAM)hfont,(LPARAM)NULL);func_hEDITfx_old_WndProc=(WNDPROC)SetWindowLongPtr(hEDITfx,GWLP_WNDPROC,(LONG)func_hEDITfx_WndProc);break;case WM_COMMAND:switch(LOWORD(wParam)){case HMENU_func_BUTTONCANCEL:DestroyWindow(hwnd);break;case HMENU_func_BUTTONOKAY:memset(FuncExpr,0,strlen(FuncExpr));GetWindowText(hEDITfx,FuncExpr,sizeof(FuncExpr));switch(CheckFuncExpr(FuncExpr)){case CHECKFUNC_FOUND_TIMEADDBR   :MessageBox(NULL,TEXT("乘号(*)后面不可以跟随加号(+)。"),TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;case CHECKFUNC_FOUND_TIMESUBBR   :MessageBox(NULL,TEXT("乘号(*)后面不可以跟随减号(-)。"),TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;case CHECKFUNC_FOUND_DIVADDBR    :MessageBox(NULL,TEXT("除号(/)后面不可以跟随加号(+)。"),TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;case CHECKFUNC_FOUND_DIVSUBBR    :MessageBox(NULL,TEXT("除号(/)后面不可以跟随减号(-)。"),TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;case CHECKFUNC_BRACKET_ERROR     :MessageBox(NULL,TEXT("括号错误")                      ,TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;case CHECKFUNC_NONUMBERAFTERSIGN :MessageBox(NULL,TEXT("运算符后无数字")              ,TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;case CHECKFUNC_NONUMBERBEFORESIGN:MessageBox(NULL,TEXT("运算符前无数字")              ,TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;case CHECKFUNC_DECIMALPOINT_ERROR:MessageBox(NULL,TEXT("小数点错误")                    ,TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;case CHECKFUNC_VARIBLEHASNOSIGN   :MessageBox(NULL,TEXT("自变量不能与数字直接连接")        ,TEXT("函数语法错误"),MB_OK|MB_ICONERROR);return 0;}if(strlen(FuncExpr)!=0)    sprintf(functions[funcnum++],"%s",FuncExpr);DestroyWindow(hwnd);break;}break;case WM_DESTROY:NEWWINDOWEXISTS=FALSE;MAINWINDOW_RESP=TRUE;PostQuitMessage(0);InvalidateRect(Main_hwnd,NULL,TRUE);break;}return DefWindowProc(hwnd,message,wParam,lParam);
}

makefile.bat:

gcc -c -O3 libtranslateexpression.c
dllwrap --def libtranslateexpression.def -o libtranslateexpression.dll libtranslateexpression.o --output-lib libtranslateexpression.a
gcc mathpaint.c -o mathpaint.exe -lgdi32 -limm32 libtranslateexpression.dll
pause

大约花了一周左右,现在忙于学业还要上网课,也就做到这个程度。
接下来方向是准备实现ln log sin cos tan cot sec csc arcsin arccos arctan arcsec arccsc sqrt abs 根号 乘方。

感谢阅读 希望大家看一看代码而不是仅仅复制。
如有转载 请注明出处。

纯C语言用Windows api写画函数图像相关推荐

  1. C语言与Windows API编程!有无同路人?

    我始终认为自己C语言学得不错,虽然没有什么产品. 曾经有一段相当长的时间我也认为C语言在现代开发中已经没有了市场,但是自从接触到了一本电子书<Programming Windows>后我发 ...

  2. 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明

    使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明 分类: 小技巧 Win32编程 C++ 解决难题 .NET2009-02-05 20:53 5186人 ...

  3. matlab 画函数图像

    画函数图像 %% 显示函数图像 f = inline( 'x^2 - x - 1'); % 定义函数 ezplot(f, -4, 4); %显示函数图形 hold on;%% 第二种形式 f = in ...

  4. tablayout 动态改变标题_描点法画函数图像的动态演示——动态数学软件GeoGebra制作教程...

    描点法画函数图像的步骤有: 列表 描点 连线 本文以制作一次函数 y=kx+b (k≠0)为例,先看效果: 觉得还不错的话,一起动手制作吧! 制作前 由于多个滑动条需设置为"递增(一次)&q ...

  5. matlab画不定积分图像实例,matlab怎么画函数图像,原来是这样的

    函数想必大家都不陌生,有时候我们需要画出函数的图形,但是复杂的函数我们画出来花费时间太多,下面我来教大家用matlab画函数图像. 工具/材料 电脑 matlab软件 操作方法 01 先下载安装这个软 ...

  6. 用计算机绘制函数图像数学大师,什么手机app可以画函数图像 能画函数图像的app推荐...

    如今手机使用越来越频繁,在一些数学问题的研究上,也可以通过手机来记性绘图,那么什么手机app可以画函数图像,小编为大家带来了几款能画函数图像的app,介绍每款安卓软件的特点,下面就一起来了解一下吧! ...

  7. Python3 matplotlib+numpy画函数图像

    Python3 matplotlib+numpy画函数图像 matplotlib和numpy是python强大的第三方库之二.numpy内置了很多数学函数,而matplotlib则可以用于绘制图像,常 ...

  8. 如何用python画函数曲线_python 画函数曲线示例 用python 怎么画函数图像

    Python如何画函数的曲线 输入以下代码导入小编们用到的函数库. >>> import numpy as np >>> import matplotlib.pyp ...

  9. 【老生谈算法】matlab实现画函数图像源码——画函数图像

    用Matlab画函数图像 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]Matlab画函数图像.doc 2.算法详解: 一. ...

最新文章

  1. vue cli3.0 引入eslint 结合vscode使用
  2. 平衡二叉树(AVL树)-详解平衡调整
  3. “2020 RT-Thread开发者大会” 思考感悟
  4. Hadoop1.x中HDFS工作原理
  5. mybatis SqlMapConfig.xml mappers
  6. cocos2d-x之SimpleGame分析
  7. post和get的区别
  8. DICOM VR数据类型表
  9. 如何解决克隆虚拟出现的Device eth0 does not seem to be present,delaying initialization错误
  10. Boost电路原理分析及其元件参数设计
  11. word如何一次将所有英文改为新罗马字体
  12. Oracle数据库性能优化艺术(第五期) 第9周 并行执行
  13. 傅里叶变换与快速傅里叶变换
  14. Profile介绍与使用
  15. 在群晖NAS上搭建WordPress动态网站并实现外网访问
  16. Alipay(支付宝)接口相关
  17. iPhone摄像头拍照后图像旋转
  18. Xcode升级到14.3 archieve打包失败
  19. 一篇对H.323协议介绍比较详细的文章
  20. 解析「觞定关中.何干」 美学文创白酒品类

热门文章

  1. android电视安装应用未安装,LG电视用户购买后无法安装第三方软件,原因是非安卓系统...
  2. 显卡 核心显卡、集成显卡与独立显卡的区别
  3. 常用的post、get工具说明
  4. 京东2017实习生招聘在线笔试编程题
  5. pb反编译研究(转)
  6. (转)【译】优化你的手机游戏(没有延迟的,才是健康的)
  7. 个人任务管理工具(TODO工具)
  8. 地震反演近期文章阅读
  9. 保研流程全解析,能保研的记得码住!
  10. 利用SQL进行水力计算