⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 一个检索单个汉字、多个汉字和词组
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "TestCorpus.h"

#include "MainFrm.h"
#include "GetDataDlg.h"
#include "retrieval.h"
#include "TitlesDlg.h"
#include "HanziInfoDlg.h"
#include "SelectData.h"
#include "SaveCorpus.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

# define HZ_NUM 6768
# define HZ_ID(c1,c2) ((c1)-176) *94 +((c2)-161)

CString corpusName="";
CStringArray texts;
BOOL CorpusModified=FALSE;
CHzInfo hzInfo[6768];
CTitlesDlg BrowseCorpusDlg;

int HZFreq[HZ_NUM];

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

// void LoadHZFreq(), StoreHZFreq();

BOOL GetData(const char * Prompt, CString & Data); // 从对话框获取用户输入的数据
BOOL GetData(const char * Prompt, int & Data);
BOOL GetData(const char * Prompt, double & Data);

void AddAFile(CString FileName); // 向语料库中增加一个文件

int FindOneHZ(const char* str, const char *hz); // 全程函数,查找单个汉字

IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_UPDATE_COMMAND_UI(ID_Add_Corpus, OnUpdateAddCorpus)
	ON_UPDATE_COMMAND_UI(ID_Retrieval_HZstring, OnUpdateRetrievalHZstring)
	ON_UPDATE_COMMAND_UI(ID_Browse_Corpus, OnUpdateBrowseCorpus)
	ON_UPDATE_COMMAND_UI(ID_Browse_HzInfo, OnUpdateBrowseHzInfo)
	ON_UPDATE_COMMAND_UI(ID_Close_Corpus, OnUpdateCloseCorpus)
	ON_COMMAND(ID_Browse_Corpus, OnBrowseCorpus)
	ON_COMMAND(ID_Browse_HzInfo, OnBrowseHzInfo)
	ON_COMMAND(ID_Create_NewCorpus, OnCreateNewCorpus)
	ON_COMMAND(ID_Close_Corpus, OnCloseCorpus)
	ON_COMMAND(ID_Open_Corpus, OnOpenCorpus)
	ON_COMMAND(ID_Add_Corpus, OnAddCorpus)
	ON_COMMAND(ID_Retrieval_HZstring, OnRetrievalHZstring)
	ON_COMMAND(ID_Find_Dup_Pattern, OnFindDupPattern)
	ON_UPDATE_COMMAND_UI(ID_Find_Dup_Pattern, OnUpdateFindDupPattern)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
}

CMainFrame::~CMainFrame()
{

}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CMDIFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CMDIFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CMDIFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


int FindOneHZ(const char* str, const char *hz)  // 全程函数:查找单个汉字
{
	char *p = (char *)str;
	while(*p!='\0') {
		if(*p>0)  // 如果当前字符是单字节字符,就将指针向前移动一个字符
			p++;
		else
			if (*p==*hz && *(p+1) == *(hz+1))
				return p-str;
			else 
				p+=2;  // 如果当前字符是双字节字符,并且没有找到匹配的结果,就将指针向前移动两个字符
	}
	return -1;
}

CString wordType(CString &w)  // 判断一个输入词串是否重叠形式的函数
{
	int n=w.GetLength();
	CString wleft, wleft2, wright2, wright;
	
	if (n==8) {
		wleft=w.Left(2);
		wright=w.Right(2);
		wleft2=w.Mid(2,2);
		wright2=w.Mid(4,2);
	}

	if (n==6) {
		wleft=w.Left(2);
		wright=w.Right(2);
		wleft2=w.Mid(2,2);
	}

	if(n==4) {
		wleft=w.Left(2);
		wright=w.Right(2);
		if (wleft==wright)
			return "AA";
		else
			return "";
	}
	else {
		if(n==6) {
			if (wleft == wright) {
				if(wleft2 == "一")
					return "A一A";
				else {
					if(wleft2=="了")
						return "A了A";
					else {
						if(wleft2== "不")
							return "A不A";
						else {
							if (wleft2=="没")
								return "A没A";
							else
								return "";  // unkown type
						}
					}
				}
			}
			else {
				if(wleft!=wleft2 && wleft2==wright)
					return "ABB";
				else {
					if (wleft==wleft2 && wleft2!=wright)
						return "AAB";
					else
						return "";
				}
			}
		}
		else {
			if (n==8) {
				if(wleft == wleft2 && wleft != wright2 && wright2==wright)
					return "AABB";
				else { 
					if(wleft!=wleft2 && wleft==wright2 && wleft2==wright)
						return "ABAB";
					else
						if (wleft!=wleft2 && wleft==wright2 && wright2!=wright && wleft2=="里")
							return "A里AB";
						else
							return "";  // unkown type
				}
			}
			else
				return "";
		}
	}
}

void CMainFrame::OnUpdateAddCorpus(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}

void CMainFrame::OnUpdateRetrievalHZstring(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}

void CMainFrame::OnUpdateBrowseCorpus(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}

void CMainFrame::OnUpdateBrowseHzInfo(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}

void CMainFrame::OnUpdateCloseCorpus(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}

void CMainFrame::OnUpdateFindDupPattern(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}

void CMainFrame::OnBrowseCorpus() 
{// 浏览语料库函数
	// TODO: Add your command handler code here
	if(corpusName.IsEmpty())
		return;

//	dlg.DoModal(); // 有模式对话框
	BrowseCorpusDlg.Create(IDD_Browse_Corpus_Files); // 无模式对话框
}

void CMainFrame::OnBrowseHzInfo() 
{//浏览语料库中汉字频度信息的菜单项函数
	// TODO: Add your command handler code here
	if(corpusName.IsEmpty())
		return;
	HanziInfoDlg dlg;
	dlg.DoModal();
}

void CMainFrame::OnCreateNewCorpus() 
{//创建一个新语料库的菜单项函数
	// TODO: Add your command handler code here
	CFileDialog dlg(FALSE,"","*.ylk",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"语料库文件|*.ylk|所有文件||"); // 获取语料库存盘文件名
	if(dlg.DoModal()!=IDOK)
		return;
	if(!corpusName.IsEmpty())
		OnCloseCorpus(); // 关闭当前语料库

	corpusName=dlg.GetPathName();
	OnAddCorpus(); // 添加语料
	OnCloseCorpus(); // 将添加的语料写入到磁盘文件中
}

void CMainFrame::OnCloseCorpus() 
{//关闭语料库
	// TODO: Add your command handler code here
	if(corpusName.IsEmpty())
		return;
	else {
		if(CorpusModified) {
			CFile cf;
			char buf[512];
			if(cf.Open((const char *) corpusName,CFile::modeCreate|CFile::modeWrite)) {
				CArchive ar(&cf,CArchive::store,512,buf);
				texts.Serialize(ar);
			}
			else {
				AfxMessageBox("语料库无法存盘!");
				return;
			}
			CFile tf;
			CString ylkName=ChangeExt(corpusName,"@@@");
			if(tf.Open((const char *) ylkName,CFile::modeCreate|CFile::modeWrite)) {
				CArchive ar(&tf,CArchive::store,512,buf);
				for(int i=0;i<6768;i++)
					hzInfo[i].Serialize(ar);
			}
			else {
				AfxMessageBox("汉字信息无法存盘!");
				return;
			}
		}
		texts.RemoveAll(); // 清除所有语料文件名
		for(int i=0;i<6768;i++) {
			hzInfo[i].Count=0; // 清除汉字出现次数信息
			hzInfo[i].TextID.RemoveAll(); // 清除地址串
		}
	}
	corpusName="";
	CorpusModified=FALSE;
}

void CMainFrame::OnOpenCorpus() 
{ // 打开语料库菜单项函数
	// TODO: Add your command handler code here
	CFileDialog dlg(TRUE,"","*.ylk",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"语料库文件|*.ylk|所有文件||");
	if(dlg.DoModal()!=IDOK)
		return;
	if(!corpusName.IsEmpty())
		OnCloseCorpus();
	
	CFile cf;
	char buf[512];
	
	if(cf.Open((const char *)(dlg.GetPathName()),CFile::modeRead)) {
		CArchive ar(&cf, CArchive::load,512,buf);
		texts.Serialize(ar);
	}
	else {
		AfxMessageBox("无法打开语料库!");
		return;
	}
	
	CFile tf;
	CString ylkName=ChangeExt(dlg.GetPathName(),"@@@");
	
	if(tf.Open((const char *)ylkName, CFile::modeRead)) {
		CArchive ar(&tf,CArchive::load,512,buf);
		for(int i=0;i<6768;i++)
			hzInfo[i].Serialize(ar);
	}
	else {
		AfxMessageBox("无法读入汉字信息!");
		return;
	}

	corpusName=dlg.GetPathName();
	CorpusModified=FALSE;

	CStatusBar * pStatus = & this->m_wndStatusBar;
	pStatus->SetPaneText(0,"当前打开语料库"+corpusName); // 在状态栏显示有关信息

	OnBrowseCorpus(); // 打开语料库后直接进入浏览语料文件对话框界面


}

void AddAFile(CString FileName) 
{ // 增加单个文件到语料库中
	int n=texts.GetSize();
	if(n==65535)
		return;
	FileName.MakeLower();
	for(int aa=0;aa<n;aa++) {
		CString fname=texts[aa];
		if(fname==FileName) {
			AfxMessageBox("文件"+FileName+"已经在语料库中!");
			return;
		}
	}
	FILE * in;
	in=fopen((const char *)FileName,"rb");
	if(!in) {
		AfxMessageBox("打不开文件"+FileName);
		return;
	}
	while(!feof(in)) {
		unsigned char c1,c2;
		c1=(unsigned char)fgetc(in);
		if(c1<128 || c1==255) 
			continue;
		c2=(unsigned char)fgetc(in);
		if(c1>=176) {
			int id=HZ_ID(c1,c2);
			if(id<0||id>=6768)
				continue;
			hzInfo[id].AddTextID(n);
		}
	}
	fclose(in);
	texts.Add(FileName); // 向字符数组中添加语料文件名
	CorpusModified=TRUE; // 设置语料库修改标记为1
}

void CMainFrame::OnAddCorpus() 
{// 增加文件到语料库中的菜单项函数
	// TODO: Add your command handler code here
	if(corpusName.IsEmpty()||texts.GetSize()==65535)
		return;
	ProcessFiles("txt","*.txt",AddAFile);
}

void CMainFrame::OnRetrievalHZstring() 
{// 查找汉字菜单项函数
	// TODO: Add your command handler code here
	CString key;
	if(!GetData("查找汉字串:",key))
		return;
	key.TrimLeft();
	key.TrimRight();
	int id,id2,n=key.GetLength();
	if(!GoodHzStr(key)) {
		AfxMessageBox("输入串中有非汉字字符!");
		return;
	}
	CWordArray *txtID,*tmp;
	id=HZ_ID((unsigned char)key[0],(unsigned char)key[1]);
	if(n==2){
		txtID=&(hzInfo[id].TextID);
		if(txtID->GetSize()==0) {
			AfxMessageBox("找不到这个汉字串!");
			return;
		}
		Retrieve(txtID,key);
		return;
	}

	id2=HZ_ID((unsigned char)key[2],(unsigned char)key[3]);
	txtID=Intersection(hzInfo[id].TextID,hzInfo[id2].TextID);

	int i=4;
	while(txtID->GetSize()>0 && i<key.GetLength()-1) {
		id2=HZ_ID((unsigned char)key[i],(unsigned char)key[i+1]);
		tmp=Intersection(*txtID,hzInfo[id2].TextID);
		delete txtID;
		txtID=tmp;
		i+=2;
	}
	if(txtID->GetSize()==0) {
		AfxMessageBox("找不到这个汉字串!");
		return;
	}
	Retrieve(txtID,key);
	delete txtID;
	return;
}

void CMainFrame::OnFindDupPattern() 
{// 检索语料库中重叠形式用例
	// TODO: Add your command handler code here
	CString dup;
	if(!SelectData(dup))
		return;

	RetrievalDupPattern(dup);
	return;
}

void CMainFrame::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	if(CorpusModified) {
		SaveCorpus dlg;
		int ID = dlg.DoModal();

		if(ID == IDCANCEL) 
			return; // if user select CANCEL
		else if (ID == IDOK)
			OnCloseCorpus();
	}

	CMDIFrameWnd::OnClose();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -