數(shù)據(jù)結(jié)構(gòu)c++課程設(shè)計(jì)報(bào)告--拼寫(xiě)檢測(cè)器_第1頁(yè)
已閱讀1頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p><b>  報(bào)告</b></p><p>  姓 名: </p><p>  學(xué) 號(hào): </p><p>  專 業(yè):

2、 </p><p>  聯(lián)系電話: </p><p>  E m a il: </p><p><b>  報(bào)告一 拼寫(xiě)檢測(cè)器</b></p><p><b>  實(shí)驗(yàn)題目</b></p><

3、p>  拼寫(xiě)檢測(cè)器(Speller checker)</p><p><b>  問(wèn)題描述</b></p><p>  1. load the words in the dictionary file(加載字典文件) </p><p>  2 .read the text file to be checked (讀取被檢測(cè)文件)</

4、p><p>  3. look up each word from the text file in the dictionary (逐個(gè)單詞的檢測(cè)其拼寫(xiě))</p><p>  4. print out the misspelled words in alphabetical order with their line numbers.(按字典順序打印出錯(cuò)誤的單詞及其行號(hào))例如某被檢測(cè)文件內(nèi)容

5、如下:</p><p>  顯然第二行的laanguage和第六行的ammong拼寫(xiě)錯(cuò)誤,輸出應(yīng)該:</p><p><b>  ammong 6</b></p><p>  laanguage 2</p><p><b>  概要設(shè)計(jì)</b></p><p><b

6、>  字典存儲(chǔ)結(jié)構(gòu)選擇</b></p><p>  由于所有的單詞的長(zhǎng)短不一,單詞中字母重復(fù)的部分很多,如果用數(shù)組存儲(chǔ)字典的話很浪費(fèi)空間,所以考慮用樹(shù)存儲(chǔ)字典,相同部分只存儲(chǔ)一次,每一棵樹(shù)只存儲(chǔ)相同字母開(kāi)頭的所有單詞,從上往下,依次存儲(chǔ),孩子的腳標(biāo)與字母對(duì)應(yīng)(0-25號(hào)樹(shù)的樹(shù)根分別存放A-Z,26-51號(hào)樹(shù)的樹(shù)根分別存放a-z,其孩子也是一樣)。</p><p><

7、b>  樹(shù)的ADT 定義:</b></p><p>  ADT DTree{</p><p>  數(shù)據(jù)對(duì)象:D={ai | ai屬于ElemSet,i=1,2,……,n n>=0}</p><p>  數(shù)據(jù)關(guān)系:若D為空集,則樹(shù)為空;若緊含一個(gè)數(shù)據(jù)元素,則數(shù)據(jù)關(guān)系為空,否則:</p><p>  D中僅有一個(gè)稱為跟

8、(root)的數(shù)據(jù)元素,關(guān)系R沒(méi)有前驅(qū)。</p><p>  除根結(jié)點(diǎn)外,其余結(jié)點(diǎn)劃分m個(gè)互不相交的子集,對(duì)任意的子集Di,<root,xi>屬于R。</p><p><b>  基本操作:</b></p><p>  InitTree(& T);</p><p><b>  //建立空樹(shù)&

9、lt;/b></p><p>  DestroyTree(& T);</p><p><b>  //銷毀樹(shù)</b></p><p><b>  Root(T) ;</b></p><p><b>  //求樹(shù)跟</b></p><p> 

10、 Insert(&T,x);</p><p>  //將元素x插入樹(shù)中</p><p>  Chile(T,x,i);</p><p>  //求x結(jié)點(diǎn)的第i個(gè)孩子</p><p>  }ADT DTree</p><p><b>  排序存儲(chǔ)結(jié)構(gòu)選擇</b></p>&l

11、t;p>  若選用數(shù)組,排序的時(shí)間復(fù)雜度很高,其單詞長(zhǎng)短不一,選用鏈表。</p><p><b>  鏈表抽象數(shù)據(jù)定義</b></p><p>  ADT LinkList{</p><p>  數(shù)據(jù)對(duì)象:D={ai| ai屬于ElemSet,i=1,2,……,n n>=0}</p><p>  數(shù)據(jù)關(guān)系:

12、R={<ai-1,ai>|ai-1,ai屬于D,i=1,2,……,n n>=0}</p><p><b>  基本操作:</b></p><p><b>  Init(&L);</b></p><p><b>  //構(gòu)造一個(gè)空鏈表</b></p><p&

13、gt;  InsertInOrder(&L,x);</p><p>  //將元素插入有序表中使之仍然有序</p><p>  DisPlay();</p><p><b>  //輸出結(jié)點(diǎn)信息</b></p><p>  }ADT LinkList;</p><p><b>

14、  其他函數(shù)</b></p><p>  主函數(shù)main()。</p><p>  建字典函數(shù)CreateDTree()。</p><p>  檢測(cè)拼寫(xiě)函數(shù)Checkspell()。</p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p>  樹(shù)存儲(chǔ)字典,每個(gè)單詞的字母是一個(gè)結(jié)點(diǎn)

15、,而鏈表存放單詞及行號(hào),用WordsLine結(jié)構(gòu)體單詞及行號(hào),定義結(jié)點(diǎn)類ListNode、鏈表類LinkList、樹(shù)結(jié)點(diǎn)類DTreeNode、樹(shù)類DTree。</p><p><b>  Stuct</b></p><p>  struct WordsLine</p><p>  {//結(jié)點(diǎn)類,存放錯(cuò)誤的單詞及其行號(hào)</p>&l

16、t;p>  string word;</p><p>  int LineNumber;</p><p><b>  };</b></p><p><b>  鏈表結(jié)點(diǎn)類</b></p><p>  class ListNode //結(jié)點(diǎn)類定義</p><

17、p><b>  {</b></p><p>  friend class LinkList; //聲明鏈表類LinkList為友元類</p><p><b>  private:</b></p><p>  WordsLine data; //結(jié)點(diǎn)的數(shù)據(jù)域</p><p>  ListN

18、ode* next; //結(jié)點(diǎn)的后繼指針域,存放后繼結(jié)點(diǎn)的地址</p><p><b>  public:</b></p><p>  ListNode();//構(gòu)造函數(shù)</p><p>  ListNode(const WordsLine e):data(e),next(NULL){} //構(gòu)造函數(shù)</p><p>

19、;  WordsLine& GetData(){return data;} //返回結(jié)點(diǎn)的數(shù)據(jù)值</p><p>  ListNode* GetNext(){return next;} //返回結(jié)點(diǎn)的指針值</p><p>  void SetData(WordsLine & e){data=e;} //設(shè)置結(jié)點(diǎn)的數(shù)據(jù)值</p><p&g

20、t;  void SetNext(ListNode* ptr){next=ptr;} //設(shè)置結(jié)點(diǎn)的指針值</p><p>  void DisPlay();//輸出結(jié)點(diǎn)的信息</p><p><b>  };</b></p><p><b>  鏈表類</b></p><p>  class

21、LinkList //鏈表類定義</p><p><b>  { </b></p><p>  friend class ListNode;</p><p><b>  private:</b></p><p>  ListNode *head; //鏈表的頭指針</p><p&

22、gt;<b>  public:</b></p><p>  LinkList(){head=new ListNode();} //構(gòu)造函數(shù),建立帶頭結(jié)點(diǎn)的空鏈表</p><p>  LinkList(WordsLine& e){head=new ListNode(e);} //構(gòu)造函數(shù)</p><p>  ~LinkList(){

23、LinkListClear();delete head;} //析構(gòu)函數(shù),刪除單鏈表</p><p>  void LinkListClear();//將線性鏈表置為空表</p><p>  ListNode* Head()const{return head;}</p><p>  void InsertInOrder(WordsLine wordsLine);

24、 //插入元素后使鏈表依然有序遞增</p><p>  bool IsEmpty(void)const{return head->next==NULL;} </p><p>  void DisPlay();//輸出所有結(jié)點(diǎn)信息</p><p><b>  };</b></p><p>  //----------

25、--------------------------</p><p><b>  樹(shù)結(jié)點(diǎn)類</b></p><p>  class DTreeNode</p><p>  {friend class DTree;</p><p>  char m_word; //每個(gè)單詞的各個(gè)字母</p><p&g

26、t;  DTreeNode* (m_tp[52]);//52個(gè)孩子,指向個(gè)大小寫(xiě)字母</p><p><b>  public: </b></p><p>  DTreeNode(); //構(gòu)造函數(shù)</p><p>  DTreeNode(char word);//構(gòu)造函數(shù)</p><p>  DTreeNode(c

27、har word,DTreeNode *tp); //構(gòu)造函數(shù)</p><p>  char Getm_word(){return m_word;} //返回結(jié)點(diǎn)元素</p><p>  DTreeNode*GetChild(char word);//返回當(dāng)前結(jié)點(diǎn)指向字符word的孩子</p><p>  bool ExistNode(char word);//判斷

28、當(dāng)前節(jié)點(diǎn)有無(wú)存放x的孩子</p><p><b>  };</b></p><p><b>  樹(shù)類</b></p><p>  class DTree</p><p><b>  {</b></p><p><b>  private:<

29、;/b></p><p>  DTreeNode* root;//樹(shù)根</p><p><b>  public:</b></p><p>  DTree():root(NULL){}//構(gòu)造函數(shù)</p><p>  DTree(char word){root=new DTreeNode(word);}//構(gòu)造函數(shù)

30、,構(gòu)造以字母word為元素的根結(jié)點(diǎn)</p><p>  DTreeNode* GetRoot(){return root;}//返回根結(jié)點(diǎn)</p><p>  int GetPosition(char word);//返回待插入元素word的位置</p><p>  void InsertWord(char* word);//將單詞word插入樹(shù)中</p>

31、;<p>  bool ExistWord(const char *word);//判斷單詞word是否存在</p><p><b>  };</b></p><p><b>  測(cè)試結(jié)果及分析</b></p><p>  程序名為speller.exe,運(yùn)行環(huán)境為Windows,在VC++6.0下測(cè)試通過(guò)。

32、程序執(zhí)行后顯示:</p><p><b>  輸入字典文件后:</b></p><p><b>  輸入被測(cè)試文件:</b></p><p>  再?gòu)囊粋€(gè)英文網(wǎng)站上copy一段,將一些單詞故意改錯(cuò)進(jìn)行測(cè)試:</p><p><b>  文件內(nèi)容為:</b></p>

33、<p><b>  測(cè)試結(jié)果為:</b></p><p>  由測(cè)試可以看出,程序的拼寫(xiě)檢測(cè)功能還是很強(qiáng)大(加載了4962個(gè)單詞到詞典)</p><p><b>  源代碼</b></p><p>  //ListNode.h</p><p>  #ifndef HEAD_LINKNOD

34、E</p><p>  #define HEAD_LINKNODE</p><p>  //---------------------------</p><p>  #include<iostream></p><p>  //---------------------------</p><p>  u

35、sing namespace std;</p><p>  //-----------------------------</p><p>  class LinkList;</p><p>  struct WordsLine</p><p>  {//結(jié)點(diǎn)類,存放錯(cuò)誤的單詞及其行號(hào)</p><p>  string

36、 word;</p><p>  int LineNumber;</p><p><b>  };</b></p><p>  class ListNode //結(jié)點(diǎn)類定義</p><p><b>  {</b></p><p>  friend class

37、 LinkList; //聲明鏈表類LinkList為友元類</p><p><b>  private:</b></p><p>  WordsLine data; //結(jié)點(diǎn)的數(shù)據(jù)域</p><p>  ListNode* next; //結(jié)點(diǎn)的后繼指針域,存放后繼結(jié)點(diǎn)的地址</p><p><b>

38、;  public:</b></p><p>  ListNode();//構(gòu)造函數(shù)</p><p>  ListNode(const WordsLine e):data(e),next(NULL){} //構(gòu)造函數(shù)</p><p>  WordsLine& GetData(){return data;} //返回結(jié)點(diǎn)的數(shù)據(jù)值</p&

39、gt;<p>  ListNode* GetNext(){return next;} //返回結(jié)點(diǎn)的指針值</p><p>  void SetData(WordsLine & e){data=e;} //設(shè)置結(jié)點(diǎn)的數(shù)據(jù)值</p><p>  void SetNext(ListNode* ptr){next=ptr;} //設(shè)置結(jié)點(diǎn)的指針值</p&

40、gt;<p>  void DisPlay();//輸出結(jié)點(diǎn)的信息</p><p><b>  };</b></p><p>  ListNode::ListNode()</p><p><b>  {</b></p><p>  data.LineNumber=0;</p>

41、;<p>  next=NULL;</p><p><b>  } </b></p><p>  void ListNode::DisPlay()</p><p><b>  {</b></p><p>  cout<<data.word<<" &

42、quot;<<data.LineNumber<<endl;</p><p><b>  }</b></p><p><b>  #endif</b></p><p>  //===================================</p><p>  //Lin

43、kList.h</p><p>  #ifndef HEAD_LINKLIST</p><p>  #define HEAD_LINKLIST</p><p>  //----------------------------</p><p>  #include<iostream></p><p>  #i

44、nclude"ListNode.h"</p><p>  #include<string></p><p>  //---------------------------</p><p>  using namespace std;</p><p>  //-------------------------&l

45、t;/p><p>  class LinkList //鏈表類定義</p><p><b>  { </b></p><p>  friend class ListNode;</p><p><b>  private:</b></p><p>  ListNode *head;

46、 //鏈表的頭指針</p><p><b>  public:</b></p><p>  LinkList(){head=new ListNode();} //構(gòu)造函數(shù),建立帶頭結(jié)點(diǎn)的空鏈表</p><p>  LinkList(WordsLine& e){head=new ListNode(e);} //構(gòu)造函數(shù)</p&g

47、t;<p>  ~LinkList(){LinkListClear();delete head;} //析構(gòu)函數(shù),刪除單鏈表</p><p>  void LinkListClear();//將線性鏈表置為空表</p><p>  ListNode* Head()const{return head;}</p><p>  void InsertIn

48、Order(WordsLine wordsLine); //插入元素后使鏈表依然有序遞增</p><p>  bool IsEmpty(void)const{return head->next==NULL;} </p><p>  void DisPlay();//輸出所有結(jié)點(diǎn)信息</p><p><b>  };</b></p&g

49、t;<p>  //------------------------------------</p><p>  void LinkList::LinkListClear()</p><p><b>  {</b></p><p>  ListNode *p,*q;</p><p>  p=head->

50、;next;</p><p>  while(p) </p><p><b>  {</b></p><p>  q=p->next;</p><p><b>  delete p;</b></p><p><b>  p=q;</b></

51、p><p><b>  }</b></p><p>  head->next=NULL;</p><p><b>  }</b></p><p>  void LinkList::InsertInOrder(WordsLine wordsLine)</p><p><

52、b>  {</b></p><p>  ListNode *s=new ListNode(wordsLine);</p><p>  ListNode *p=head;</p><p>  while(p->next)</p><p>  {//尋找當(dāng)wordsLine的單詞剛好大于當(dāng)前結(jié)點(diǎn)的單詞的結(jié)點(diǎn)</p&g

53、t;<p>  //如果找到剛好大于的結(jié)點(diǎn),插入</p><p>  if(strcmp(s->data.word.c_str(),p->next->data.word.c_str())<0) break;</p><p>  else //否則當(dāng)結(jié)點(diǎn)不空時(shí)后移,空的時(shí)候插入</p><p>  if(p->next-&g

54、t;next){p=p->next;}</p><p>  else break;</p><p><b>  }</b></p><p><b>  //插入</b></p><p>  s->next=p->next;</p><p>  p->n

55、ext=s;</p><p><b>  }</b></p><p>  void LinkList::DisPlay()</p><p>  {//調(diào)用結(jié)點(diǎn)類的成員函數(shù)ListNode::DisPlay()</p><p>  ListNode *p=head->next;</p><p>

56、;  if(!p) //表空則表明所有單詞拼寫(xiě)正確,不用輸出,返回程序</p><p>  {cout<<"All words are spelled correctly!!!"<<endl;return;} </p><p>  //否則輸出錯(cuò)誤的單詞信息</p><p>  cout<<"The

57、incorrectly spelled words in alphabetical order with their linenumber are:"<<endl;</p><p>  cout<<endl;</p><p><b>  while(p)</b></p><p><b>  {<

58、/b></p><p>  p->DisPlay();</p><p>  p=p->next;</p><p><b>  }</b></p><p>  cout<<endl;</p><p><b>  }</b></p>&

59、lt;p><b>  #endif</b></p><p>  //===================================</p><p>  // DTreeNode.h</p><p>  #include<iostream></p><p>  using namespace st

60、d;</p><p>  class DTree;</p><p>  class DTreeNode</p><p>  {friend class DTree;</p><p>  char m_word; //每個(gè)單詞的各個(gè)字母</p><p>  DTreeNode* (m_tp[52]);//52個(gè)孩子,指

61、向個(gè)大小寫(xiě)字母</p><p><b>  public: </b></p><p>  DTreeNode(); //構(gòu)造函數(shù)</p><p>  DTreeNode(char word);//構(gòu)造函數(shù)</p><p>  DTreeNode(char word,DTreeNode *tp); //構(gòu)造函數(shù)<

62、/p><p>  char Getm_word(){return m_word;} //返回結(jié)點(diǎn)元素</p><p>  DTreeNode*GetChild(char word);//返回當(dāng)前結(jié)點(diǎn)指向字符word的孩子</p><p>  bool ExistNode(char word);//判斷當(dāng)前節(jié)點(diǎn)有無(wú)存放x的孩子</p><p>&l

63、t;b>  };</b></p><p>  DTreeNode::DTreeNode()</p><p><b>  {//構(gòu)造函數(shù)</b></p><p>  m_word='\0';</p><p>  for(int i=0;i<52;i++) m_tp[i]=NULL;&

64、lt;/p><p><b>  }</b></p><p>  DTreeNode::DTreeNode(char word)</p><p><b>  {//構(gòu)造函數(shù)</b></p><p>  m_word=word;</p><p>  for(int i=0;i<

65、52;i++) m_tp[i]=NULL;</p><p><b>  }</b></p><p>  DTreeNode* DTreeNode::GetChild(char word)</p><p>  {//返回當(dāng)前結(jié)點(diǎn)指向字符word的孩子</p><p>  int child=((word>='

66、A' && word<='Z')?word%'A':26+(word%'a'));</p><p>  return m_tp[child];</p><p><b>  }</b></p><p>  bool DTreeNode::ExistNode(char w

67、ord)</p><p><b>  {</b></p><p>  int child=((word>='A' && word<='Z')?word%'A':26+(word%'a'));</p><p>  return m_tp[child]!=N

68、ULL;</p><p><b>  }</b></p><p><b>  //DTree.h</b></p><p>  #include<iostream></p><p>  #include "DTreeNode.h"</p><p>

69、;  using namespace std;</p><p>  class DTree</p><p><b>  {</b></p><p><b>  private:</b></p><p>  DTreeNode* root;//樹(shù)根</p><p><b&

70、gt;  public:</b></p><p>  DTree():root(NULL){}//構(gòu)造函數(shù)</p><p>  DTree(char word){root=new DTreeNode(word);}//構(gòu)造函數(shù),構(gòu)造以字母word為元素的根結(jié)點(diǎn)</p><p>  DTreeNode* GetRoot(){return root;}//返

71、回根結(jié)點(diǎn)</p><p>  int GetPosition(char word);//返回待插入元素word的位置</p><p>  void InsertWord(char* word);//將單詞word插入樹(shù)中</p><p>  bool ExistWord(const char *word);//判斷單詞word是否存在</p><

72、p><b>  };</b></p><p>  void DTree::InsertWord(char* word)</p><p>  {//將單詞word插入樹(shù)中,相同的樹(shù)中重復(fù)部分只存一次</p><p>  if(!word || *word =='\0') return;</p><p>

73、;  if(root==NULL || root->m_word=='\0') root=new DTreeNode(*word);</p><p>  DTreeNode* tmp=root;</p><p><b>  if(tmp)</b></p><p><b>  {</b></p&g

74、t;<p><b>  word++;</b></p><p>  while(tmp)</p><p>  {//將單詞word從第一個(gè)字母開(kāi)始與root比較順著相同</p><p>  //的結(jié)點(diǎn)走,直到下一個(gè)結(jié)點(diǎn)元素與單詞下一個(gè)字母不同</p><p>  if(tmp->ExistNode(*

75、word))</p><p><b>  {</b></p><p>  tmp=tmp->GetChild(*word);</p><p><b>  word++;</b></p><p><b>  }</b></p><p>  else

76、break;</p><p><b>  }</b></p><p>  while(word&&*word!='\0')</p><p>  {//將所有沒(méi)有的部分插入樹(shù)中</p><p>  int child=((*word>='A' && *w

77、ord<='Z')?*word%'A':26+(*word%'a'));</p><p>  tmp->m_tp[child]=new DTreeNode(*word);</p><p>  tmp=tmp->m_tp[child];</p><p><b>  word++;</b&

78、gt;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  bool DTree::ExistWord(const char *word)</p><p>  {//

79、判斷單詞word是否存在</p><p>  DTreeNode* tmp=root;</p><p>  if(tmp&&tmp->m_word==(*word))</p><p>  {//如果第一個(gè)字母與根結(jié)點(diǎn)值不同為false</p><p><b>  word++;</b></p&

80、gt;<p>  while(word&&*word!='\0'&&tmp&&tmp->ExistNode(*word))</p><p>  {//將單詞word從第一個(gè)字母開(kāi)始與root比較,順著相同</p><p>  //的結(jié)點(diǎn)走,直到word結(jié)束且tmp!=0則為真</p><

81、p>  tmp=tmp->GetChild(*word);</p><p><b>  word++;</b></p><p><b>  }</b></p><p>  if(*word!='\0') return false;</p><p>  else retur

82、n true;</p><p><b>  }</b></p><p>  else return false;</p><p><b>  }</b></p><p>  //speller.cpp</p><p>  #include<iostream><

83、;/p><p>  #include<fstream></p><p>  #include<sstream></p><p>  #include<string></p><p>  #include"DTree.h"</p><p>  #include"

84、;LinkList.h"</p><p>  //-----------------------</p><p>  using namespace std;</p><p>  //-----------------------</p><p>  LinkList L;//用一個(gè)鏈表儲(chǔ)存錯(cuò)誤的單詞(方便排序)</p>

85、<p>  //---------------------------</p><p>  DTree m_dTree[52];//用一個(gè)數(shù)組存放所有樹(shù),下標(biāo)與根結(jié)點(diǎn)字母對(duì)應(yīng)</p><p>  //--------------------------</p><p>  void CreateDTree();//加載字典文件,創(chuàng)建字典</p&g

86、t;<p>  void CheckSpell();//檢測(cè)文檔拼寫(xiě),將錯(cuò)誤的排序</p><p>  //---------------------</p><p>  void main()</p><p><b>  {</b></p><p>  CreateDTree();</p>

87、<p>  CheckSpell();</p><p>  L.DisPlay();//調(diào)用鏈表成員函數(shù),將所有錯(cuò)誤的單詞信息輸出</p><p>  system("pause");//暫停,便于用戶查看屏幕上輸出的錯(cuò)誤單詞的信息</p><p><b>  }</b></p><p> 

88、 void CreateDTree()</p><p><b>  {</b></p><p><b>  //加載字典文檔</b></p><p>  //--------------------------</p><p>  string file;</p><p> 

89、 cout<<"請(qǐng)輸入字典文件(包括完整路勁):"<<endl;</p><p>  cin>>file;</p><p>  ifstream in(file.c_str());</p><p>  cout<<"字典加載中……請(qǐng)等待?。?!"<<endl;</

90、p><p>  //--------------------------</p><p>  for(string s;getline(in,s);)</p><p><b>  {</b></p><p>  char word[30];</p><p>  istringstream sin(s)

91、;</p><p>  char ch;int i=0;</p><p>  while(sin>>ch) </p><p><b>  {</b></p><p>  word[i]=ch;</p><p><b>  i++;</b></p>&

92、lt;p><b>  }</b></p><p>  word[i]='\0';</p><p>  int pos_word;//定位單詞存放在哪顆樹(shù)中(先存大寫(xiě)字母開(kāi)頭的)</p><p>  //0-25號(hào)樹(shù)的樹(shù)根分別存放A-Z,-51號(hào)樹(shù)的樹(shù)根分別存放a-z</p><p>  pos_wo

93、rd=((*word>='A' && *word<='Z')?*word%'A':26+(*word%'a'));</p><p>  m_dTree[pos_word].InsertWord(word);</p><p><b>  }</b></p><

94、p><b>  }</b></p><p>  void CheckSpell()</p><p><b>  {</b></p><p>  //加載被檢測(cè)的文檔</p><p>  //--------------------------</p><p>  str

95、ing file;</p><p>  cout<<"請(qǐng)輸入要檢測(cè)的文件(包括完整路勁):"<<endl;</p><p>  cin>>file;</p><p>  ifstream in(file.c_str());</p><p>  cout<<"拼寫(xiě)檢測(cè)

96、中……請(qǐng)等待!??!"<<endl;</p><p>  //--------------------------</p><p>  int LineNumber=0;</p><p>  for(string s;getline(in,s);)</p><p><b>  {</b></p&

97、gt;<p>  LineNumber++;//每讀一行,行數(shù)加</p><p>  istringstream sin(s);</p><p>  while(sin>>s)</p><p><b>  {</b></p><p>  char*tmp=(char*)s.c_str();//s

98、tring轉(zhuǎn)char*</p><p>  while(*tmp!='\0')</p><p><b>  {</b></p><p>  int flag=1;//用來(lái)標(biāo)記當(dāng)行string中是否含多個(gè)單詞。為表示只有一個(gè)</p><p>  char*word=tmp;//指向</p>&

99、lt;p>  while((*tmp>='A'&&*tmp<='Z')||(*tmp>='a'&&*tmp<='z'))</p><p>  {//直到當(dāng)前單詞完,獲得完整的一個(gè)單詞</p><p><b>  ++tmp;</b><

100、/p><p><b>  }</b></p><p>  //以下代碼執(zhí)行如下工作</p><p>  //-----------------------------------</p><p>  //進(jìn)行檢測(cè)。如果單詞在字典中不存在則拼寫(xiě)錯(cuò)誤,將單詞及其行號(hào)入鏈表排序</p><p>  //(用

101、鏈表將錯(cuò)誤單詞按字母順序排序),最后將所有錯(cuò)誤單詞輸出</p><p>  //如果當(dāng)前行未結(jié)束,表明是遇到標(biāo)點(diǎn),當(dāng)前單詞結(jié)束,設(shè)置當(dāng)前單詞結(jié)束</p><p>  //(后面可能仍然還有單詞)然后進(jìn)入下一個(gè)單詞</p><p>  //如果字符串結(jié)束(當(dāng)前行當(dāng)前單詞以后沒(méi)有單詞)</p><p><b>  //則開(kāi)始下一行<

102、;/b></p><p>  //-------------------------------------</p><p>  if(*tmp!='\0')</p><p>  {//如果當(dāng)前行未結(jié)束</p><p><b>  flag=0;</b></p><p>  

103、*tmp='\0';//設(shè)置當(dāng)前單詞結(jié)束</p><p><b>  }</b></p><p>  int pos_word;//定位單詞存放在哪顆樹(shù)中</p><p>  bool big=false;</p><p>  pos_word=((*word>='A' &&

104、amp; *word<='Z')?(*word%'A'):(26+(*word%'a')));</p><p>  if(!m_dTree[pos_word].ExistWord(word))</p><p>  {//單詞在字典中不存在</p><p>  if((*word>='A' &

105、amp;& *word<='Z'))</p><p>  {//將單詞的第一個(gè)大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)的再檢測(cè)</p><p>  char*tmp=word;</p><p>  *tmp=*tmp+32;//首字母轉(zhuǎn)換成小寫(xiě)的</p><p>  pos_word=26+(*tmp%'a');<

106、;/p><p>  big=m_dTree[pos_word].ExistWord(tmp);</p><p><b>  }</b></p><p><b>  if(!big)</b></p><p>  {//當(dāng)單詞大小寫(xiě)都不存在的的時(shí)候,拼寫(xiě)錯(cuò)誤,入鏈表排序</p><p&g

107、t;  WordsLine wordsLine;//結(jié)構(gòu)體,存放單詞和所在行號(hào)</p><p>  wordsLine.LineNumber=LineNumber;</p><p>  wordsLine.word=word;</p><p>  L.InsertInOrder(wordsLine);//調(diào)用鏈表的成員函數(shù)排序</p><p>

108、;<b>  }</b></p><p><b>  }</b></p><p>  if(flag) break;//如果當(dāng)前行結(jié)束,則開(kāi)始下一行</p><p><b>  else </b></p><p><b>  {</b></p>

109、<p>  tmp++;//如果當(dāng)前行未結(jié)束,則進(jìn)入下一個(gè)單詞(先過(guò)濾掉標(biāo)點(diǎn))</p><p>  while(*tmp!='\0'&&!((*tmp>='A'&&*tmp<='Z')||(*tmp>='a'&&*tmp<='z'))) </p

110、><p><b>  tmp++; </b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論