1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| #include <Windows.h> #include "TuringMachine.h"
HINSTANCE hInstance; HWND hWinMain; LPCSTR szClassName = "VLSMB"; LPCSTR szCaptionMain = "计算理论-图灵机程序 Code By VLSMB";
LPCSTR HELP_DOCUMENT = "计算理论-图灵机程序 Code By VLSMB\r\n\r\n使用说明:\r\n首先点击加载语法,选择一个图灵机文件(*.tm)加载到程序中。然后在输入框中输入你想输入的语句,点击左侧的输入按钮完成输入。之后就可以点击左侧的执行单步或者执行全部来模拟图灵机的运行。\r\n\r\n*.tm文件结构的说明:\r\n第一行,是一个字符串。描述这个tm的作用。(注意中文编码为GBK!!!)\r\n第二行有一个数字k,代表图灵机状态的数量(图灵机的状态从0开始,则状态为0~k - 1,其中k - 1为终止状态,0为开始状态)\r\n第三行有一个数字a,代表输入字符种类的个数。\r\n第四行有a个字符,每个字符使用空格相隔,代表输入字符的集合。(字符为char,这里只给出输入带上的字符,图灵机后来填涂的字符不算)\r\n第五行有一个整数n,代表转移函数的个数。\r\n之后有n行五元组,每一行为一个转移函数,分别为q、a、q'、a'、d,含义见图灵机定义。";
LRESULT CALLBACK _ProcWinMain(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI _WinMain();
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { return _WinMain(); }
LRESULT CALLBACK _ProcWinMain(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: { InitTMMemory(); HWND hWnBtn = CreateWindowExA(0, "BUTTON", "加载语法", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 30, 30, 100, 30, hWnd, (HMENU)(BTN_LOAD), hInstance, NULL); HFONT hFont = CreateFontA(14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial"); HFONT hFont_Big = CreateFontA(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial"); HFONT hFont_Data = CreateFontA(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Courier"); SendMessageA(hWnBtn, WM_SETFONT, (WPARAM)hFont, TRUE); HWND hWnEdit = CreateWindowExA(0, "STATIC", "未加载图灵机。", WS_CHILD | WS_VISIBLE, 180, 30, 520, 30, hWnd, (HMENU)EDIT_GRINFO, hInstance, NULL); SendMessageA(hWnEdit, WM_SETFONT, (WPARAM)hFont_Big, TRUE); hWnEdit = CreateWindowExA(0, "BUTTON", "点击输入", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 30, 100, 100, 30, hWnd, (HMENU)BTN_INPUT, hInstance, NULL); SendMessageA(hWnEdit, WM_SETFONT, (WPARAM)hFont, TRUE); hWnEdit = CreateWindowEx(0, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL, 180, 100, 520, 30, hWnd, (HMENU)EDIT_INPUT, hInstance, NULL); SendMessageA(hWnEdit, WM_SETFONT, (WPARAM)hFont_Data, TRUE); hWnEdit = CreateWindowExA(0, "STATIC", "输出:", WS_CHILD | WS_VISIBLE, 30, 150, 100, 30, hWnd, (HMENU)EDIT_GRINFO, hInstance, NULL); SendMessageA(hWnEdit, WM_SETFONT, (WPARAM)hFont_Big, TRUE); hWnEdit = CreateWindowEx(0, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | ES_AUTOHSCROLL, 180, 150, 520, 300, hWnd, (HMENU)EDIT_OUTPUT, hInstance, NULL); ShowScrollBar(hWnEdit, SB_VERT, TRUE); SendMessageA(hWnEdit, EM_SETSEL, 0, 0); SendMessageA(hWnEdit, EM_SETREADONLY, TRUE, 0); SendMessageA(hWnEdit, WM_SETFONT, (WPARAM)hFont_Data, TRUE); hWnBtn = CreateWindowExA(0, "BUTTON", "执行单句", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 30, 200, 100, 30, hWnd, (HMENU)(BTN_RUNSingle), hInstance, NULL); SendMessageA(hWnBtn, WM_SETFONT, (WPARAM)hFont, TRUE); hWnBtn = CreateWindowExA(0, "BUTTON", "全部执行", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 30, 250, 100, 30, hWnd, (HMENU)(BTN_RUNAll), hInstance, NULL); SendMessageA(hWnBtn, WM_SETFONT, (WPARAM)hFont, TRUE); hWnBtn = CreateWindowExA(0, "BUTTON", "帮助", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 30, 350, 100, 30, hWnd, (HMENU)(BTN_HELP), hInstance, NULL); SendMessageA(hWnBtn, WM_SETFONT, (WPARAM)hFont, TRUE); hWnBtn = CreateWindowExA(0, "BUTTON", "清空输入", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 30, 300, 100, 30, hWnd, (HMENU)(BTN_CLEAR), hInstance, NULL); SendMessageA(hWnBtn, WM_SETFONT, (WPARAM)hFont, TRUE); } break; case WM_CLOSE: DeleteTMMemory(); DestroyWindow(hWnd); PostQuitMessage(NULL); break; case WM_COMMAND: { if (LOWORD(wParam) == BTN_LOAD && HIWORD(wParam) == BN_CLICKED) { ReadTuringMachine(hWnd); } else if (LOWORD(wParam) == BTN_RUNSingle && HIWORD(wParam) == BN_CLICKED) { RunSingleStep(hWnd); } else if (LOWORD(wParam) == BTN_RUNAll && HIWORD(wParam) == BN_CLICKED) { RunAllStep(hWnd); } else if (LOWORD(wParam) == BTN_INPUT && HIWORD(wParam) == BN_CLICKED) { GetInput(hWnd); } else if (LOWORD(wParam) == BTN_CLEAR && HIWORD(wParam) == BN_CLICKED) { ClearInput(hWnd); } else if (LOWORD(wParam) == BTN_HELP && HIWORD(wParam) == BN_CLICKED) { MessageBoxA(hWnd, HELP_DOCUMENT, TITLE, MB_ICONINFORMATION); } } default: return DefWindowProcA(hWnd, uMsg, wParam, lParam); } return 0; } int WINAPI _WinMain() { WNDCLASSEXA stWndClass; MSG stMsg; hInstance = GetModuleHandleA(NULL); RtlZeroMemory(&stWndClass, sizeof(stWndClass));
stWndClass.hCursor = LoadCursorA(0, IDC_ARROW); stWndClass.hInstance = hInstance; stWndClass.cbSize = sizeof(WNDCLASSEX); stWndClass.style = CS_HREDRAW | CS_VREDRAW; stWndClass.lpfnWndProc = _ProcWinMain; stWndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); stWndClass.lpszClassName = szClassName; RegisterClassExA(&stWndClass);
hWinMain = CreateWindowExA(WS_EX_CLIENTEDGE, szClassName, szCaptionMain, WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, NULL, NULL, hInstance, NULL); ShowWindow(hWinMain, SW_SHOWNORMAL); UpdateWindow(hWinMain);
while (1) { if (GetMessageA(&stMsg, NULL, 0, 0) == 0) break; TranslateMessage(&stMsg); DispatchMessageA(&stMsg); } return (int)stMsg.wParam; }
|