1. 程式人生 > >2012-2013學年第二學期《C++程式設計》上機考試題

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); }