2016-05-02 16 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; 
} 
} 

私はこのプログラムを実行すると、それが印刷さ:2つの文を比較する際

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

真剣に、文が同じ前後を読み取るかどうかを判断するコードです。 'std :: reverse()'を使った簡単な3行または4行の関数が必要です。 – 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; 
} 

sentBackwardsではないので、引数として渡された文字列が回文

2

である場合にはtrueを返しますsentForwardsと同じです。sentBackwardsの末尾に空白があり、同じではないためです。

1

vectorについてだけでなく、std::reverseなどのSTLアルゴリズム関数についても学習する必要があります。

もう1つの答えが指摘されているように、1つのベクトルには末尾の空白があります。元のベクターを取り出して別のベクターにコピーし、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は、2つのベクトルのそれぞれの項目を比較し、すべての項目が同じであればtrueを返し、オーバーロードoperator ==を持っているので、これは、動作します。


これに加えて、ベクトルへの読み込みは、試みたよりもはるかに簡単に行うことができます。

#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(オーバーロードされた==のような)のさまざまなメンバ関数を利用することによって達成されます。

関連する問題