2012-2013學年第二學期《C++程式設計》上機考試題
關鍵詞統計
當大家需要上網查詢資料的時候,自然而然地會進入類似Google或Baidu等提供搜尋服務的網站,輸入要查詢資訊的關鍵詞,搜尋引擎會在資料庫中進行搜尋,如果找到與使用者要求內容相符的網站,便採用特殊的演算法——通常根據網頁中關鍵詞的匹配程度、出現的位置、頻次、連結質量等計算出各網頁的相關度及排名等級,然後根據關聯度高低,按順序將這些網頁連結返回給使用者。
你打算暑期到某個搜尋網站公司去實習,面試官要求你用C++語言編寫一個程式,能迅速準確地發現某個網頁(英文網頁,只有文字)是否含有某些特定的關鍵詞,並統計出所有關鍵詞出現的次數。
已知每個關鍵詞只含字母(’A’-‘Z’和’a’-‘z’),不區分大小寫。但面試官想測試一下你的程式設計水平有多高,他把關鍵詞混在一些非字母字元中。例如:關鍵詞是abroad, 那麼如果網頁裡出現yA B#ro7 a$ 4D8z也算關鍵詞abroad出現一次(關鍵詞的前後可出現字母,也可出現非字母字元,關鍵詞的各字母之間只能出現0個或多個非字母字元)。
程式名稱:keyword.cpp 輸入檔案(keyword.in)
第1行:只有1個正整數N(0< N <=10),表示關鍵詞的個數;
第2行至第N+1行:關鍵詞,一行一個關鍵詞(一個關鍵詞最大長度不超過40); 第N+2行到最後:網頁內容
一個網頁不會超過2,000字元(包含所有字元)。網頁可能一行或多行,但是每行都不超過80個字元(不包括最後的換行符)。
輸出檔案(keyword.out)
輸出只有一行,這一行只包含一個整數,表示網頁中所有關鍵詞出現的次數。如果整個網頁中沒有關鍵詞,輸出結果為0。
輸入樣例
2
AbRoad
sTudy
So you’re leaving tosTu d78 y @aBro# Ad! You are about to have the time of your life. For most students,st$u dying #ab %Ro 9adis the single most memorable thing they’ll do in their university life.
輸出樣例
4
2018.11.10號判斷關鍵字有問題,搞了一天才做出來。
#include <iostream> #include <fstream> #include <vector> #include <string> #include <cstring> using namespace std;
class keyword{ private: vector<string> vec; string text; public: void read(); void write(); int checkWord(); };
void keyword::read() { string s; ifstream rst("keyword.in"); if(!rst) { cout<<"檔案打不開"<<endl; return; } getline(rst,s); int x = atoi(s.c_str()); if(x<=0 && x>10) { cout<<"檔案輸入關鍵字個數錯誤"<<endl; return; } string str; for(int i=0;i< x;i++) { getline(rst,str); for (int j= 0; j< str.size(); j++) { if ((str[j] < 'A' && str[j] > 'Z') || (str[j] < 'a' && str[j] > 'z')) { cout<<"檔案關鍵字錯誤"<<endl; return; } } vec.push_back(str); } while(getline(rst,str)){ text += str; } rst.close(); }
int keyword::checkWord() { string tmp; int i=0; int j=0; int t=0; //判斷字串和key是否相等 int result=0; //檢查結果 vector<string>::iterator p; for ( p= vec.begin(); p != vec.end(); ++p) { tmp = *p; for (;j< tmp.size();j++) { for (;i< text.length();i++) { if ((text[i]>= 'A' && text[i] <= 'Z')|| (text[i]>= 'a' && text[i] <= 'z')) { if(tolower(text[i]) == tolower(tmp[j])){ t++; break; } } if(t==tmp.size()-1){ t = 0; j=0; //key值重新迴圈 result++; } } } } return result; }
void keyword::write(int p) { ofstream wst("keyword.out"); if(!wst) { cout<<"檔案建立失敗"<<endl; return; } //cout<< r <<endl; if (p > 0) { wst << p; } else { wst << 0; } wst.close(); }
int main() { keyword k; k.read(); int r = k.checkWord(); k.write(r); }