這次的題目是

英文斷詞

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=15924

問題描述 :

斷詞在自然語言的研究上是個很重要的步驟,主要就是將關鍵字從句子中斷出,英文的斷詞較為簡單,就根據句子中的空格將英文字隔開。

輸入說明 :

輸入一句英文敘述句。 字元數≤1000。

輸出說明 :

將輸入的句子進行斷詞,將斷出的關鍵字依照句子中的出現排序列印出。全部轉成小寫,列印出的關鍵字不得重複,關鍵字間以一個空格隔開,最後一個關鍵字後面進行換行。例如輸入 How do you do ,則輸出 how do you 。

範例 :

輸入範例

輸出範例

How do you do

how do you

 

這個題目重點就是要教如何用空白分割和大小寫用ASCII code 切換跟vector陣列

好,開始講解

首先,宣告字串string,讓使用者輸入

最上面記得打上#include <string.h>才可以用string的函式

再來是分割句子中每個詞

該怎麼寫哩

就要用到istringstream這個函式

要用這個的話,開頭得打上#include <sstream>

istringstream delim(input);

這行的意思是這個函式可以把input讀入到delim裡面

上面那行while迴圈的寫法是

getline(delim[來源位置],token[存入位置],' '[分割的條件])[讀入字串,遇到空白時分割,將分割出來的字串存入token]

以上條件成立時,開始以下動作

再來是迴圈裡要做甚麼

題目要印出沒重複的詞,並且每個字母都要是小寫

所以,從對每一個切出來的字串開始

首先,用for迴圈來判斷切出來的詞中,是不是都是小寫

如果不是,就轉,所以要透過ASCII code來將大寫轉成小寫

大寫的A~Z的ASCII  code介在65~90

而小寫的a~z ASCII code 則介在97~122

將token裡有大寫字母的位置的值都加上32,就能轉成小寫

再來是判斷有沒有重複

所以,一個一個切,一個一個放進陣列

這裡要講解的陣列是vector

在最上面要打上#include <vector>

vector的好處是,它在存入東西時,就像排隊一樣,先存的排第一個,依此類推

可以不用像C,需要先寫範圍

寫法是vector<型別>名稱

就跟排五月天的票和排蘇打綠的票一樣

兩個不同團的粉絲不能同時排在一起

所以不同型別的也不能同時存入一個vector陣列

再來,判斷有切出來的詞有沒有相同的已經在陣列裡了

沒有就存

存進去的寫法是陣列名稱.push_back(東西)

最後把陣列裡的東西印出來,這題就解決啦

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <string.h>  
  4. #include <sstream>  
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     vector<string>arr;  
  10.     string input;  
  11.     getline(cin,input);  
  12.     istringstream delim(input);  
  13.     string token;  
  14.     int c=0;  
  15.     while(getline(delim,token,' '))  
  16.     {  
  17.         int k=0;  
  18.         int len=token.size();  
  19.         for(int k=0;k<len;k++)  
  20.         {  
  21.             if(token[k]>64 && token[k]<91)  
  22.                 token[k]+=32;  
  23.         }  
  24.         for(int i=0;i<c;i++)  
  25.         {  
  26.             if(token==arr[i])  
  27.                 k=1;  
  28.         }  
  29.         if(k!=1)  
  30.         {  
  31.             arr.push_back(token);  
  32.             c++;  
  33.         }  
  34.     }  
  35.     for(int j=0;j<c;j++)  
  36.     {  
  37.         if(j!=c-1)  
  38.             cout<<arr[j]<<" ";  
  39.         else  
  40.             cout<<arr[j]<<endl;  
  41.     }  
  42.     return 0;  
  43. }  

 

 

 

若想閱讀相關文章請關注我的粉絲團

小資菜鳥向前衝

https://www.facebook.com/%E5%B0%8F%E8%B3%87%E8%8F%9C%E9%B3%A5%E5%90%91%E5%89%8D%E8%A1%9D-204484273323335/?fref=ts

文章標籤
創作者介紹

cychss6305的部落格

cychss6305 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • 訪客
  • 程式碼是錯的 ㄎㄎ
    少了迴圈
  • 上傳到網站是對的啊,可以請教一下是哪裡出了錯嗎

    cychss6305 於 2017/06/16 00:19 回覆

  • 路人
  • 請問為什麼我試了很多方法都無法讓它按照我需要的次數重複執行呢
  • 可以更詳細的描述你的問題嗎,單靠這句我無法知道你的問題在哪

    cychss6305 於 2017/09/13 20:57 回覆