使用c++ 建立一个windows对话框图形环境应用程序,添加相关编辑框和按钮,点击按钮直接运行固定txt文件(或打开文件对话框,选择 txt文件),统计文件中词的频数,并在图形界面编辑框中显示频数最大10个词,和它的频数。
时间: 2024-02-16 19:04:17 浏览: 147
好的,我会尽我所能地回答你的问题。首先,建立一个Windows对话框图形环境应用程序需要使用Win32 API,而使用C++语言编写。下面是实现的步骤:
1. 创建一个空的Windows对话框应用程序项目。
2. 在资源编辑器中添加相关编辑框和按钮。比如,我们可以添加一个编辑框用于显示文本文件中词频最高的10个词,以及一个按钮用于打开文件对话框。
3. 在按钮的回调函数中,打开文件对话框,让用户选择要统计词频的文本文件。
4. 统计文本文件中每个词的出现频率,并将它们存储在一个map中。
5. 在编辑框中显示出现频率最高的10个词以及它们的频率。
下面是一个简单的代码示例,可以帮助你更好地理解:
```c++
#include <Windows.h>
#include <map>
#include <string>
#include <fstream>
#include <algorithm>
// 定义一个结构体用于存储控件句柄
struct Controls
{
HWND hEdit;
HWND hButton;
};
// 打开文件对话框
std::string OpenFile(HWND hWnd)
{
OPENFILENAME ofn;
char szFile[MAX_PATH] = { 0 };
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = "txt";
if (GetOpenFileName(&ofn))
{
return ofn.lpstrFile;
}
return "";
}
// 统计词频
std::map<std::string, int> CountWords(const std::string& filename)
{
std::map<std::string, int> wordCount;
std::ifstream file(filename);
if (file)
{
std::string word;
while (file >> word)
{
// 转换小写
std::transform(word.begin(), word.end(), word.begin(), ::tolower);
// 去除标点符号
word.erase(std::remove_if(word.begin(), word.end(), ispunct), word.end());
// 统计词频
if (word.length() > 0)
{
wordCount[word]++;
}
}
}
return wordCount;
}
// 比较函数,用于按照词频从高到低排序
bool CompareWords(const std::pair<std::string, int>& a, const std::pair<std::string, int>& b)
{
return (a.second > b.second);
}
// 更新编辑框中的内容
void UpdateEdit(HWND hEdit, const std::map<std::string, int>& wordCount)
{
// 按照词频排序
std::vector<std::pair<std::string, int>> words(wordCount.begin(), wordCount.end());
std::sort(words.begin(), words.end(), CompareWords);
// 更新编辑框中的内容
std::string text;
for (int i = 0; i < 10 && i < words.size(); i++)
{
text += words[i].first + " : " + std::to_string(words[i].second) + "\r\n";
}
SetWindowText(hEdit, text.c_str());
}
// 按钮的回调函数
void OnButtonClicked(HWND hWnd, Controls* pControls)
{
// 打开文件对话框
std::string filename = OpenFile(hWnd);
if (filename.length() > 0)
{
// 统计词频
std::map<std::string, int> wordCount = CountWords(filename);
// 更新编辑框中的内容
UpdateEdit(pControls->hEdit, wordCount);
}
}
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static Controls controls = { 0 };
switch (message)
{
case WM_CREATE:
{
// 创建编辑框
controls.hEdit = CreateWindow("EDIT", NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
10, 10, 300, 200, hWnd, NULL, NULL, NULL);
// 创建按钮
controls.hButton = CreateWindow("BUTTON", "Open",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 220, 100, 30, hWnd, NULL, NULL, NULL);
// 设置按钮的回调函数
SetWindowLongPtr(controls.hButton, GWLP_USERDATA, (LONG_PTR)&controls);
SetWindowLongPtr(controls.hButton, GWLP_WNDPROC, (LONG_PTR)[](HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -> LRESULT {
Controls* pControls = (Controls*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
switch (message)
{
case WM_COMMAND:
if (LOWORD(wParam) == BN_CLICKED)
{
OnButtonClicked(hWnd, pControls);
}
break;
}
return CallWindowProc((WNDPROC)DefWindowProc, hWnd, message, wParam, lParam);
});
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
// 主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 注册窗口类
WNDCLASSEX wcex;
ZeroMemory(&wcex, sizeof(wcex));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.hInstance = hInstance;
wcex.lpszClassName = "MyWindowClass";
wcex.lpfnWndProc = WndProc;
RegisterClassEx(&wcex);
// 创建窗口
HWND hWnd = CreateWindow("MyWindowClass", "My Window",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
340, 300, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return -1;
}
// 显示窗口
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
```
需要注意的是,这只是一个简单的示例,可能还有很多需要完善的地方。比如,如果文本文件过大,可能会导致程序的运行速度变慢。此外,还可以添加一些错误处理和异常处理的代码,以提高程序的稳定性和健壮性。
阅读全文