写个小程序有效突破SAT词汇关
来源:互联网 发布:数控编程代码z代表什么 编辑:程序博客网 时间:2024/05/21 15:27
今天正在扫荡刚看完的小说《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";//转换之后的CRCchar 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” 无疑会出现几十次,那么如果其他小说里面某个同样的高级词汇如果也出现了几十次
,或者它的原型,复数和过去分词交替出现很多次,那不是影响了这本小说的真正含金量吗,所以程序也要把那个单词和单词出现的数量输出一下,以供参考- 写个小程序有效突破SAT词汇关
- 利用词汇特点突破SAT填空题
- 突破SAT阅读生词关有法可循
- 通过电影有效速记GRE词汇方法之从听力突破口语语音
- SAT数学核心词汇之代数词汇
- SAT词汇背诵需“点面结合”
- SAT数学核心词汇介绍
- SAT数学基础词汇记忆
- SAT几何专业词汇一览
- SAT阅读常见重要词汇
- SAT数学核心词汇一览
- SAT数学常用代数词汇
- SAT数学常见几何词汇
- SAT数学专业词汇整理
- SAT词汇记忆方法【zhasite】
- 以英文为主记忆SAT词汇介绍
- 如何跨越SAT阅读词汇的障碍
- SAT数学单位类词汇介绍
- 编程之美 2.18 数组分割
- HDU/HDOJ1851 nim博弈和巴什博弈的结合
- Hibernate中实现模糊查询
- 如何使用VC的预编译技术(转载)
- 位运算
- 写个小程序有效突破SAT词汇关
- mysql添加删除主键
- WPF中拖动控件,实现位置随意摆放
- C++ const 与 指针
- Python字符串统计以及排序
- 写给女友的JS教程---之JS闭包
- SQLite 数据库操作
- 网站
- jquery easyUI 中动态 改变 Datagrid中数据的方法