這次的題目是
英文斷詞
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(東西)
最後把陣列裡的東西印出來,這題就解決啦
- #include <iostream>
- #include <vector>
- #include <string.h>
- #include <sstream>
- using namespace std;
- int main()
- {
- vector<string>arr;
- string input;
- getline(cin,input);
- istringstream delim(input);
- string token;
- int c=0;
- while(getline(delim,token,' '))
- {
- int k=0;
- int len=token.size();
- for(int k=0;k<len;k++)
- {
- if(token[k]>64 && token[k]<91)
- token[k]+=32;
- }
- for(int i=0;i<c;i++)
- {
- if(token==arr[i])
- k=1;
- }
- if(k!=1)
- {
- arr.push_back(token);
- c++;
- }
- }
- for(int j=0;j<c;j++)
- {
- if(j!=c-1)
- cout<<arr[j]<<" ";
- else
- cout<<arr[j]<<endl;
- }
- return 0;
- }
若想閱讀相關文章請關注我的粉絲團
小資菜鳥向前衝
留言列表