输入法算法实现

这篇博客主要介绍了作者实现输入法的第一版和第二版核心算法,提供了相关源码下载链接。第二版因时间仓促可能存在问题,作者鼓励读者通过邮件942690451@qq.com反馈问题。
摘要由CSDN通过智能技术生成

输入法第一版: 

http://wenku.baidu.com/view/04906204eff9aef8941e06ac.html

http://download.csdn.net/detail/yql1990115/3944309


输入法第二版源码:【以后有空的话在写输入法的系统架构】【本来是要写C版本的输入法,后面发现麻烦就直接写了C++版的】

C版本:【没写完】

http://blog.csdn.net/yql1990115/article/details/8316408

声明:本人原创,只限于交流学习,欢迎转载

这里我只是实现了核心算法,UI有空的时候在实现O(∩_∩)O~

第二版实现的时候时间仓促,如有问题,欢迎发邮件给我:942690451@qq.com

第二版输入法源码下载:

http://download.csdn.net/detail/yql1990115/5101527

http://pan.baidu.com/share/link?shareid=374764&uk=2449640175

http://www.pudn.com/downloads517/sourcecode/windows/ime/detail2144960.html


接下来上代码:

字接口

#if !defined(_ICODE_H_)
#define _ICODE_H_

class ICode
{
public:
	ICode(){};
	virtual ~ICode(){};
public:
	virtual CString GetData() = 0;
	virtual bool	SetData(CString strValue) = 0;
	//
	virtual bool	SvaeData(CFile &mCFile) = 0;
	virtual bool	ReadData(CFile &mCFile) = 0;
};

#endif 

字接口实现

#if !defined(_CLSCODE_H_)
#define _CLSCODE_H_

#include "ICode.h"

class ClsCode:public ICode
{
public:
	ClsCode(){};
	~ClsCode(){};
	//
public:
	CString GetData();
	bool	SetData(CString strValue);
	//
	bool	SvaeData(CFile &mCFile);
	bool	ReadData(CFile &mCFile);
private:
	CString	m_strCode;
};

#endif 


#include "StdAfx.h"
#include "ClsCode.h"

//默认字码长度[一个汉字]
#define CLSCODE_CODELENGTH 2

//获取数据
CString ClsCode::GetData()
{
	return this->m_strCode;
}

//设置数据
bool ClsCode::SetData(CString strValue)
{
	//处理数据[对数据进行检验]
	int mLength = strValue.GetLength();
	assert(CLSCODE_CODELENGTH == mLength);
	//
	if (CLSCODE_CODELENGTH == mLength)
	{
		this->m_strCode = strValue;
		return true;
	}
	return false;
}

bool ClsCode::ReadData(CFile &mCFile)
{
	UCHAR szBuff[3] = {0};
	int mLength = mCFile.Read(szBuff, CLSCODE_CODELENGTH);
	assert(CLSCODE_CODELENGTH == mLength);
	//
	if (CLSCODE_CODELENGTH == mLength)
	{
		m_strCode = szBuff;
		return true;
	}
	TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "ReadData出错", __FILE__, __LINE__);
	return false;
}

bool ClsCode::SvaeData(CFile &mCFile)
{
	int mLength = m_strCode.GetLength();
	assert(CLSCODE_CODELENGTH == mLength);
	if ((this->m_strCode.IsEmpty() == FALSE) && (CLSCODE_CODELENGTH == mLength))
	{		
		mCFile.Write(m_strCode.GetBuffer(mLength), mLength);
		m_strCode.ReleaseBuffer();
		return true;
	}
	TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "SvaeData出错", __FILE__, __LINE__);
	return false;
}


字的管理集合:树节点实现 [使用模板,降低耦合]

#if !defined(_ClsGuideTreeNode_H_)
#define _ClsGuideTreeNode_H_

#include "list"
#include "ICode.h"
//
using namespace std;
//
template <class TICode> class ClsGuideTreeNode;
//
template <class TICode>
class ClsGuideTreeNode{
public:
	ClsGuideTreeNode(){ Init(); };
	virtual	~ClsGuideTreeNode(){ Unit(); };
	//
public:
	bool	Init(){ List_Iterator = m_CodeList.begin();	return true; };
	void	Unit(){};
	//
	bool	MoveFirst()
	{ 
		List_Iterator = m_CodeList.begin();
		if (List_Iterator != m_CodeList.end())
		{
			return true;
		}
		TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "MoveFirst失败", __FILE__, __LINE__);
		return false; 
	};
	//
	bool	MoveLast()
	{ 
		List_Iterator = m_CodeList.end();
		List_Iterator--;
		if (List_Iterator != m_CodeList.end())
		{
			return true;
		}
		TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "MoveLast失败", __FILE__, __LINE__);
		return false; 
	};
	//
	bool	MoveNext()
	{ 
		List_Iterator++;
		if (List_Iterator != m_CodeList.end())
		{
			return true;
		}
		TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "MoveNext失败", __FILE__, __LINE__);
		return false; 
	};
	//
	bool	MovePrec()
	{ 
		List_Iterator--;
		if (List_Iterator != m_CodeList.end())
		{
			return true;
		}
		TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "MovePrec失败", __FILE__, __LINE__);
		return false; 
	};
	//
	bool	HasData(){ return true != m_CodeList.empty(); };
	//
	bool	GetData(TICode &GetCode)
	{ 
		if (HasData())
		{
			GetCode = *List_Iterator;
			return true;
		}
		return false; 
	};
	//
	bool	AddData(TICode SetCode)
	{ 
		m_CodeList.push_back(SetCode);
		return true; 
	};
	//
	bool	RemoveData()
	{ 
		if (HasData())
		{
			list<TICode>::iterator	Temp_Iterator;
			Temp_Iterator = List_Iterator;
			List_Iterator++;
			m_CodeList.erase(Temp_Iterator);
			return true;
		}
		TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "RemoveData失败", __FILE__, __LINE__);
		return false; 
	};
	//
private:
	list<TICode>		m_CodeList;
	list<TICode>::iterator	List_Iterator;
};

#endif 

树节点的管理,树本身的实现:

#if !defined(_CLSGUIDETREE_H_)
#define _CLSGUIDETREE_H_

#include "list"
#include "ClsCode.h"
#include "ClsGuideTreeNode.h"
//
using namespace std;
//
class ClsGuideTree;
//
#define CLSGUIDETREE_READLENGTH 1
//
//枚举 指令码
enum	Enum_GuideTree_OrderCode{
	//创建孩子节点[创建成功、节点移到孩子节点]
	Enum_GuideTree_OrderCode_CreateChild		= '1',
	//创建兄弟节点[创建成功、节点移到兄弟节点]
	Enum_GuideTree_OrderCode_CreateBrother		= '2',
	//添加数据[添加的数据追加到末尾]
	Enum_GuideTree_OrderCode_AddListCode		= '3',
	//读取Key
	Enum_GuideTree_OrderCode_ReadKey			= '4',
	//移到孩子节点
	Enum_GuideTree_OrderCode_MoveChild			= '5',
	//移到下一个兄弟节点
	Enum_GuideTree_OrderCode_MoveBrother		= '6',
	//移动到双亲结点
	Enum_GuideTree_OrderCode_MoveParent			= '7',
	//移动到头结点
	Enum_GuideTree_OrderCode_MoveHead			= '8',
};
//
//树节点
typedef struct _SParGuideTree_Node{
	//映射值
	UCHAR	m_KeyValue;
	//节点数据区
	ClsGuideTreeNode<ClsCode>	m_NodeData;
	//孩子节点
	struct _SParGuideTree_Node	*pNextChild;
	//兄弟节点
	struct _SParGuideTree_Node	*pNextBrother;
	//父亲节点
	struct _SParGuideTree_Node	*pParent;
}SParGuideTree_Node, *pSParGuideTree_Node;
//
//树节点公用计数
typedef	struct SParGuideTree_Share{
	//头节点
	SParGuideTree_Node	m_HeadNode;
	//引用计数
	UINT	m_Count;
	//标记
	UINT	m_Flags;
}SParGuideTree_Share, *pSParGuideTree_Share;
//
//引导树参数
typedef s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值