2016-05-02 101 views
-1

我目前正在學習矢量並嘗試使用它們製作迴文程序。這是一個簡單的程序,到目前爲止,我試圖讓它識別出「我是我」。作爲迴文正確。這是我的計劃至今:迴文計劃沒有正確比較

#include <vector> 
#include <string> 
#include <iostream> 

using namespace std; 

vector <string> sentVec; 

void getSent(string sent); 
void readBackwards(string sent); 

int main() 
{ 
string sent; 

getSent(sent); 
readBackwards(sent); 
return 0; 
} 

void getSent(string sent) 
{ 
cout << "Enter your sentence:" << endl; 
getline (cin,sent); 

string currentWord, currentLetter; 

for (int i = 0; i < sent.length(); i++) 
{ 
    currentLetter = sent[i]; 

    if (currentLetter == " ") // inserts word 
    { 
    currentWord += sent[i]; 
    sentVec.push_back(currentWord); 
    currentWord = ""; 
    } 
    else if (currentLetter == ".") // inserts period 
    { 
    sentVec.push_back(currentWord); 
    currentWord = sent[i]; 
    sentVec.push_back(currentWord); 
    } 
    else 
    { 
    currentWord += sent[i]; 
    } 
} 
} 

void readBackwards(string sent) 
{ 
string sentForwards, sentBackwards; 

// create sentence forwards and backwards without the period. 
for (int i = 0; i < sentVec.size() - 1; i++) 
{ 
    sentForwards += sentVec[i]; 
} 

for (int j = sentVec.size() - 2; j >= 0; j--) 
{ 
    sentBackwards += sentVec[j]; 

    if (j == sentVec.size() - 2) 
    { 
    sentBackwards += " "; 
    } 
} 

cout << "Sentence forwards is: " << sentForwards << endl; 
cout << "Sentence backwards is: " << sentBackwards << endl; 

if (sentForwards == sentBackwards) 
{ 
    cout << "This sentence reads the same backwards as forwards." << endl; 
} 
else 
{ 
    cout << "This sentence does not read the same backwards as forwards." << endl; 
} 
} 

當我運行這個程序,它打印:

Enter your sentence: 
I am what am I. 
Sentence forwards is: I am what am I 
Sentence backwards is: I am what am I 
This sentence does not read the same backwards as forwards. 

爲什麼比較兩句器時,這不會觸發如果循環?

+2

的各種成員函數。看起來好像太多代碼來確定一個句子是否讀取相同的前後向。一個簡單的3或4行函數使用'std :: reverse()'是你所需要的。 – PaulMcKenzie

+0

請在這裏看到一個更簡單的實現:http://ideone.com/rqJuOe – PaulMcKenzie

+0

添加一些日誌記錄,看看發生了什麼。例如,記錄兩個字符串的長度。 –

回答

1

我不確定你的程序如何檢測迴文,但這裏是一個簡單的迭代方法:

#include <string> 

bool isPalindrome(std::string in) { 
    for (int i = 0; i < in.size()/2; i++) { 
     if (in[i] != in[in.size() - 1 - i]) { 
      return false; 
     } 
    } 

    return true; 
} 

如果作爲參數傳遞的字符串是迴文

2

因爲sentBackwards是不是返回true與sentForwards相同,因爲sentBackwards末尾有一個尾隨空白,因此它們不相同。

1

您不僅應該瞭解vector,還需要了解STL算法函數,如std::reverse

正如給出的其他答案指出的那樣,一個向量有一個尾隨空白。你可以通過簡單地取出原始矢量,將它複製到另一個矢量,然後調用std::reverse來避免所有這些。有沒有必要寫一個循環:

void readBackwards() 
{ 
    // copy the vector 
    std::vector<std::string> sentBackwards = sentVec; 

    // reverse it 
    std::reverse(sentBackwards.begin(), sentBackwards.end()); 

    // see if they're equal 
    if (sentVec == sentBackwards) 
     cout << "This sentence reads the same backwards as forwards." << endl; 
    else 
     cout << "This sentence does not read the same backwards as forwards." << endl; 
} 

這工作,因爲std::vector有一個重載operator ==該項目分別在兩個向量相比較,並且返回true如果所有項目都是相同的。


除此之外,讀入載體可以比您嘗試更容易地完成。

#include <sstream> 
#include <algorithm> 
//... 
void getSent(string sent) 
{ 
    // remove the periods(s) 
    auto iter = std::remove_if(sent.begin(), sent.end(), [] (char ch) { return ch == '.';}); 
    sent.erase(iter, sent.end()); 

    // copy the data to a vector 
    std::istringstream iss(sent); 
    string currentword; 
    while (iss >> currentword) 
     sentVec.push_back(currentword); 
} 

請注意,我們使用std::istringstream作爲空間分隔的解析器,減輕需要寫一個循環尋找空間。此外,std::remove_if算法用於在開始將單個字符串存儲到向量中之前從字符串中刪除任何句點字符。

因此,基本上,整個設置中的唯一循環是從流中讀入矢量的while。其他的一切都是通過使用算法函數來完成的,並利用了std::vector(如超載==