?? wncn.cpp
字號(hào):
//***************************************************
//
// 中英文WordNet在線詞典
//
// 本軟件遵從LGPL協(xié)議,完全開放所以源代碼及設(shè)計(jì)文檔。
//
// 寧夏大學(xué)智能網(wǎng)格系統(tǒng)實(shí)驗(yàn)室 張冬 康彩 2005.10
//
//****************************************************/
#include <time.h>
#include <process.h>
#include <conio.h>
#include <windows.h>
//#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#define USER_PORT 6060
char *NotFind = "Null NXU AGL!";
long DictNum;
// 數(shù)據(jù)緩沖區(qū)
char MwordNwt[210500][1024];
char wordIndex1[50];
long wordIndex2;
char MW1[210500][50];
long MW2[99999999];
// 搜索索引 單詞
long IWM1[259][259];
unsigned __stdcall HttpThread(void * p);
unsigned long hThreadHandle;
unsigned uThreadID;
// 查找數(shù)據(jù)
long GetIt(char *word);
// 讀取WordNetCN詞典
int LoadDictLine(char *filename,long& num);
// 得到請求數(shù)據(jù) 查找數(shù)據(jù) 發(fā)送數(shù)據(jù)
//void GetNewWordNetCN(BufferSocket BufSock);
// 初始化
void startcom();
// 數(shù)據(jù)結(jié)構(gòu)分解
void strX(long num);
// 排列隊(duì)列 建立索引
void SearchIndexMake();
/***************************************************************************************************************
初始化
***************************************************************************************************************/
void startcom()
{
printf("Init WordNetCN ...\n");
//初始化索引
memset(MW2,0,sizeof(MW2));
//讀取詞典數(shù)據(jù)
LoadDictLine("main.data",DictNum);
//排列隊(duì)列: 統(tǒng)計(jì)排序 建立索引
SearchIndexMake();
printf("Initialization OK ! Grid Dict COPYLEFT 2005 NXU AGL\n");
printf("Start Service ......");
}
/***************************************************************************************************************
查找數(shù)據(jù) 得到一個(gè)單詞的基本信息 查找類型 0 根據(jù)序號(hào) 1 根據(jù)名稱 數(shù)據(jù)值
***************************************************************************************************************/
long GetIt(char *word)
{
long i,vi,t,l2,l,s1,s2,t1,t2,Ls;
//kcbaby
long nword;
int w;
w=word[0];
//判斷查找方式
vi=-999;
Ls=strlen(word);
//判斷查詢的是單詞還是根據(jù)標(biāo)示查詢
if (word[1]<'A' && word[1]>0 && Ls==8)
{
nword = atof(word);
if (MW2[nword]>0){return MW2[nword];}else {return vi;}
}
else
{ // 1 根據(jù)名稱
if(Ls==0)
{
return vi;
}
if(Ls==1)
{
if(word[0]>0)
{
t1=word[0];
s1=IWM1[t1][0];
s2=s1+1;
}
else
{
t1=word[0]+256;
s1=IWM1[t1][0];
s2=s1+1;
}
}
else
{
if(word[0]>0)
{
t1=word[0];
}
else
{
t1=word[0]+256;
}
if(word[1]>0)
{
t2=word[1];
}
else
{
t2=word[1]+256;
}
s1=IWM1[t1][t2];
s2=IWM1[t1][t2+1];
}
for (i=s1;i<s2; i++)
{
l2= strlen(MW1[i]);
if (Ls==l2)
{
t=strncmp(MW1[i],word,Ls);
if(t==0)
{
return i;
}
}
}
}
return vi;
}
/***************************************************************************************************************
讀取WordNetCN詞典
***************************************************************************************************************/
int LoadDictLine(char *filename,long& num)
{
char tword[1024];
num=0;
FILE *fp;
if((fp=fopen(filename,"r"))==NULL)
{
printf("Open the DB failed\n");
return 0;
}
else
{
while(fgets(tword,1024,fp)!=NULL)
{
num++;
memcpy(MwordNwt[num],tword,sizeof(MwordNwt[num]));
if(strlen(MwordNwt[num])>10) //建立索引
{
strX(num); //拆解WordNetCN 數(shù)據(jù)
strcpy(MW1[num],wordIndex1);// 單詞壓入索引表
MW2[wordIndex2]=num; //標(biāo)示壓入索引表
}
if(num%30000==9300)
{
printf("Init One : ");
printf("%d%%\n",num/2100);
}
// if (num>=10000){goto SS;}
}
rewind(fp);
}
SS:;
printf("Init One : ");
printf("%d%%\n",100);
fclose(fp);
return 1;
}
/***************************************************************************************************************
數(shù)據(jù)結(jié)構(gòu)分解
***************************************************************************************************************/
void strX(long num)
{
long j=0,i,s1=0,s2=0,sl;
char d1[9];
char d2[50];
sl=strlen(MwordNwt[num]);
for(i=0;i<=sl;i++)
{
if(sl>1020)
{
MessageBox (NULL, TEXT (MwordNwt[num]), TEXT ("HelloMsg"), 0);
}
if(MwordNwt[num][i]==9 || MwordNwt[num][i]==124)
{
j=j+1;
i=i+1;
}
if(j==0) //遇到標(biāo)號(hào)
{
if(MwordNwt[num][i]>47 && MwordNwt[num][i]<58 && s1<8)
{
d1[s1] = MwordNwt[num][i];
s1=s1+1;
}
}
if (j==1) //第一行加末尾
{
if (s1==8)
{
d1[s1] = '\0';
}
}
if (j==4) //開始單詞
{
if (MwordNwt[num][i]!=124 && s2<29 && MwordNwt[num][i]!=9 && MwordNwt[num][i]!=10 && MwordNwt[num][i]!=11 && MwordNwt[num][i]!=12 && MwordNwt[num][i]!=13)
{
d2[s2] = MwordNwt[num][i];
s2=s2+1;
}
}
if (j==5) //第一行加末尾
{
d2[s2]= '\0';
break;
}
}
wordIndex2=0;
strcpy(wordIndex1,"\0\0\0\0");
strcpy(wordIndex1,d2);
//d1[8]="\0";
wordIndex2= atof(d1);
}
/***************************************************************************************************************
排列隊(duì)列: 統(tǒng)計(jì)排序 建立索引
***************************************************************************************************************/
void SearchIndexMake()
{
long i,j,h1,h2,o,L;
o=DictNum;
//初始化
memset(IWM1,0,sizeof(IWM1));
for (i=1;i<=o;i++)
{
h1=-999;
h2=-999;
L=strlen(MW1[i]);
//長度為0
if (L==0)
{
goto bakcIt2;
}
//只有1個(gè)字目
if (L==1 && MW1[i][0]>0)
{
h1=MW1[i][0];
h2=0;
if(IWM1[h1][h2]==0)
{
IWM1[h1][h2]=i;
}
goto bakcIt2;
}
//只有1個(gè)字節(jié) 特殊情況
if(L==1 && MW1[i][0]<0)
{
h1=MW1[i][0]+256;
h2=0;
if(IWM1[h1][h2]==0)
{
IWM1[h1][h2]=i;
}
goto bakcIt2;
}
//多個(gè)字母 或 漢字
if(L>=2 )
{
if(MW1[i][0]>0)
{
h1=MW1[i][0];
}
else
{
h1=MW1[i][0]+256;
}
if(MW1[i][1]>0)
{
h2=MW1[i][1];
}
else
{
h2=MW1[i][1]+256;
}
if(IWM1[h1][h2]==0)
{
IWM1[h1][h2]=i;
}
goto bakcIt2;
}
bakcIt2:;
if (i%60000==39200)
{
printf("Init Two : ");
printf("%d%%\n",i*100/o);
}
}
IWM1[256][256]=o;
for (i=256;i>=0;i--) //填充數(shù)據(jù) 前<--后 首尾相應(yīng)
{
for (j=256;j>=1;j--)
{
if(IWM1[i][j-1]==0 && IWM1[i][j]!=0 )
{
IWM1[i][j-1]=IWM1[i][j];
}
}
for (j=0;j>=256;j++)
{
if(IWM1[i-1][256]==0 && IWM1[i][j]!=0)
{
IWM1[i-1][256]=IWM1[i][j];
}
}
}
printf("Init Two : ");
printf("%d%%\n",100);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -