用C++建立一个windows对话框图形环境应用程序,添加相关编辑框和按钮,点击按钮直接运行固定txt文件(或打开文件对话框,选择 txt文件),统计文件中词的频数,并在图形界面编辑框中显示频数最大10个词,和它的频数。
时间: 2023-07-15 09:15:39 浏览: 135
这是一个比较复杂的任务,需要用到Windows API和C++语言知识。以下是一个基本实现的示例代码:
```c++
#include <windows.h>
#include <string>
#include <vector>
#include <map>
#include <fstream>
// 对话框窗口句柄
HWND hDlg = NULL;
// 文本框和按钮控件ID
const int IDC_TEXT = 1001;
const int IDC_BUTTON = 1002;
// 词频统计结果
std::map<std::string, int> freqMap;
// 词频统计函数
void countWords(const std::string& text) {
std::string word;
for (auto c : text) {
if (isalpha(c)) { // 如果是字母,添加到单词中
word += tolower(c);
} else if (!word.empty()) { // 如果是分隔符,统计单词
freqMap[word]++;
word.clear();
}
}
if (!word.empty()) { // 统计最后一个单词
freqMap[word]++;
}
}
// 更新词频结果控件
void updateResultControl(HWND hCtrl) {
// 排序词频结果
std::vector<std::pair<std::string, int>> freqVec(freqMap.begin(), freqMap.end());
std::sort(freqVec.begin(), freqVec.end(),
[](const auto& a, const auto& b) { return a.second > b.second; });
// 显示前10个词频结果
std::string text;
for (int i = 0; i < std::min<int>(10, freqVec.size()); i++) {
text += freqVec[i].first + " : " + std::to_string(freqVec[i].second) + "\r\n";
}
SetWindowText(hCtrl, text.c_str());
}
// 对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_INITDIALOG:
hDlg = hWnd;
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_BUTTON:
// 打开文件对话框选择txt文件
OPENFILENAME ofn;
TCHAR szFile[260] = {0};
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hDlg;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn) == TRUE) {
// 打开文件并统计词频
freqMap.clear();
std::ifstream ifs(szFile);
if (ifs.is_open()) {
std::string text((std::istreambuf_iterator<char>(ifs)),
std::istreambuf_iterator<char>());
countWords(text);
}
ifs.close();
// 更新词频结果控件
HWND hCtrl = GetDlgItem(hDlg, IDC_TEXT);
updateResultControl(hCtrl);
}
return TRUE;
}
break;
case WM_CLOSE:
EndDialog(hWnd, 0);
return TRUE;
}
return FALSE;
}
// 应用程序入口函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc);
}
```
这个程序的核心部分是在点击按钮时打开文件对话框选择文本文件,并将文本文件中每个单词的词频统计到一个 std::map 中。然后,通过排序和截取前10个元素来显示频数最大的10个单词及其频数。注意,为了避免大小写差异和单词分隔符问题,我们在统计单词时需要进行一些预处理,具体见代码。
阅读全文