寫個小程序有效突破SAT詞彙關

今天正在掃蕩剛看完的小說《The Invisible Man》的生詞,突然覺得如果我可以找到一本小說,裏面涵蓋特別多的SAT詞彙,這樣就可以有針對性地看小說了,至少能先把詞彙惡補一下。

小程序實現思想:

一 將barron 3500單詞列表的單詞抽出來換算爲CRC碼,存放在文件A中。之所以換算成CRC碼是因爲覺得字符串比較可
能太慢?雖然比較CRC也不會快多少倍,儘量快點吧

二 把單詞的CRC按升序排列(初步想而已,也有可能因爲我閒麻煩直接就這樣不排序好了 哈哈)

三 把小說裏的單詞都抽出來,逐個換爲CRC碼,再用二分法查找有序CRC文件裏是否存在這個單詞,如果存在,這個小說就加1分,分越多,這本小說含金量(高級詞彙量)越高


隨便起個程序名吧,FMIN(Find the most informative novel)

crc.h

unsigned int crc32(unsigned char *buf, int len);
crc.c

#include <stdio.h>
#include "crc.h"

static unsigned int   CRC32[256];
static char   init = 0;

//初始化表
static void init_table()
{
    int   i,j;
    unsigned int   crc;
    for(i = 0;i < 256;i++)
    {
         crc = i;
        for(j = 0;j < 8;j++)
        {
            if(crc & 1)
            {
                 crc = (crc >> 1) ^ 0xEDB88320;
            }
            else
            {
                 crc = crc >> 1;
            }
        }
         CRC32[i] = crc;
    }
}

//crc32實現函數
unsigned int crc32(unsigned char *buf, int len)

{
    unsigned int ret = 0xFFFFFFFF;
    int   i;
    if( !init )
    {
         init_table();
         init = 1;
    }
    for(i = 0; i < len;i++)
    {
         ret = CRC32[((ret & 0xFF) ^ buf[i])] ^ (ret >> 8);
    }
     ret = ~ret;
    return ret;
}

FMIN.C,這是將單詞列表寫成CRC的代碼

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "crc.h"



int main(int argc, char *argv[])
{
	//準備工作
	int i=0,j=0,k=0;
	//單詞列表
	char szFileName[]="c:\\1.txt";
	//轉換之後的CRC
	char szFileNameCRC[]="c:\\CRC.txt";
	//轉換之後的CRC文件大小
	int CRCFilesize=3500*4;
	//轉換之後的CRC數組
	int Barron3500CRC[3500*4];
	//臨時文件句柄
	HANDLE fhandle;
	//單詞列表文件的大小
	long lFileSize;
	//放單詞列表的緩衝區
	char *wordbuffer=malloc(40000);
	//臨時單詞緩衝區
	char *eachword=malloc(20);
	//全部緩衝區填零
	memset(wordbuffer,0,40000);
	memset(eachword,0,20);
	memset(Barron3500CRC,0,3500*4);
	fhandle=CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
	if(fhandle == INVALID_HANDLE_VALUE)
	{
	MessageBox(NULL,"讀取單詞列表失敗","Tips",NULL);
	}
	lFileSize=GetFileSize(fhandle,NULL);
	ReadFile(fhandle,wordbuffer,lFileSize,&lFileSize,NULL);
	//計算出每個單詞的CRC放在數組裏
	while(wordbuffer[i]!='#')
	{
		if(wordbuffer[i]!=0x0D && wordbuffer[i]!=0x0A)
		{
			eachword[j++]=wordbuffer[i++];
		}
		else
		{
			if(wordbuffer[i++]==0x0D)
			{
				Barron3500CRC[k++]=crc32(eachword,strlen(eachword));
				memset(eachword,0,20);
				j=0;
			}
		}
	}
	CloseHandle(fhandle);
	//CRC數組寫入文件
	fhandle=CreateFile(szFileNameCRC, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
	WriteFile(fhandle,Barron3500CRC,CRCFilesize,&CRCFilesize,NULL);
	CloseHandle(fhandle);
}


這是搜索小說中的單詞,對照CRC的代碼(同樣也要包含CRC那兩個文件)

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "crc.h"


char *GetWord(char *wordbuffer,long index);
int WordExist(unsigned int wordCRC,int *Barron3500);


int main(int argc, char *argv[])
{
	//準備工作
	int i=0,j=0,k=0;
	HANDLE fhandle;
	char szFileNameCRC[]="c:\\CRC.txt";
	char szFileNameNV[]="c:\\2.txt";
	int CRCFilesize=3500*4;
	long lFileSize=0;
	int Barron3500CRC[3500*4];
	int eachCRC=0;
	int bWordExist=0;
	int bFirstTime=0;
	int score=0;
	char *eachword=malloc(20);
	char *wordbuffer=malloc(2000);
	memset(eachword,0,20);
	memset(wordbuffer,0,2000);
	fhandle=CreateFile(szFileNameCRC, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
	if(fhandle == INVALID_HANDLE_VALUE)
	{
		MessageBox(NULL,"讀取單詞列表失敗","Tips",MB_OK);
	}
	ReadFile(fhandle,Barron3500CRC,CRCFilesize,&CRCFilesize,NULL);
	CloseHandle(fhandle);


	fhandle=CreateFile(szFileNameNV, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
	if(fhandle == INVALID_HANDLE_VALUE)
	{
		MessageBox(NULL,"讀取單詞列表失敗","Tips",NULL);
	}
	lFileSize=GetFileSize(fhandle,NULL);
	ReadFile(fhandle,wordbuffer,lFileSize,&lFileSize,NULL);


	while(wordbuffer[i]!='#')
	{
		if(wordbuffer[i]==0x20)
			bFirstTime=1;
			i++;
			if(wordbuffer[i]==0x20 && bFirstTime==1)//單詞結束
			{
				//得到單詞
				eachword=GetWord(wordbuffer,i-1);
				//轉CRC碼
				eachCRC=crc32(eachword,strlen(eachword));
				//匹配
				bWordExist=WordExist(eachCRC,Barron3500CRC);
				//加分
				if(bWordExist==1)
					score++;
				bFirstTime=0;
			}
	}
	CloseHandle(fhandle);
	printf("this novel got a score of %d\n",score);
}


char *GetWord(char *wordbuffer,long index)
{
	int j=0;
	char *ret=malloc(20);
	memset(ret,0,20);
	while(wordbuffer[index--]!=0x20);
	index=index+2;
	while(wordbuffer[index]!=0x20)
	{
		ret[j++]=wordbuffer[index++];
	}
	return ret;
}


int WordExist(unsigned int wordCRC,int *Barron3500)
{
	int i;
	for(i=0;i<3500;i++)
	{
		if(wordCRC==Barron3500[i])
			return 1;
	}
	return 0;
}

很好,運行得不錯,但是又出現了兩個問題:

單詞是複數怎麼辦,是過去式怎麼辦,是過去分詞怎麼辦??

由於是小說,所以很多動詞都不會出現一般式,複數的出現就更加頻繁了。

這樣一來似乎只有形容詞和副詞的甄別比較有效了

http://dict.youdao.com/search?q=dodge&keyfrom=fanyi.smartResult

這個翻譯網頁能夠把過去式 過去分詞 和複數都搞出來,而且網頁源碼中也會出現,可以自己寫個小程序先處理一下列表,就是說把列表中的動詞名詞的各種形態都加上去

另外有一個問題就是,比如說我讀的這本小說《The Invisible Man》,那麼單詞“Invisible” 無疑會出現幾十次,那麼如果其他小說裏面某個同樣的高級詞彙如果也出現了幾十次

,或者它的原型,複數和過去分詞交替出現很多次,那不是影響了這本小說的真正含金量嗎,所以程序也要把那個單詞和單詞出現的數量輸出一下,以供參考
發佈了50 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章