2012-01-25 3 views
0

文章中の回文の数を出力するプログラムがあります。大文字と小文字を区別せず、カンマやピリオドを無視します。たとえば、回文が文の最後の単語であるとします。「ma'am」という単語を入力すると、プログラムは回文として数えません。

#include <iostream> 
#include <string> 

using namespace std; 

char toUpper(char c) { 
    if (c >= 'a' && c <= 'z') 
     return c - 'a' + 'A'; 
    else 
     return c; 
} 

char isLetter(char c) { 
    return (toUpper(c) >= 'A' && toUpper(c) <= 'Z'); 
} 

int findNextLetter(string& s, int start) { 
    // find first letter at or after 'start' 
    for (int i = start; i < s.length(); ++i) { 
     if (isLetter(s[i])) return i; 
    } 
    return s.length(); 
} 

int findNextPunct(string& s, int start) { 
    // find first non-letter character at or after 'start' 
    for (int i = start; i < s.length(); ++i) { 
     if (!isLetter(s[i])) return i; 
    } 
    return s.length(); 
} 

bool isPalindrome (const string& s, int start, int stop) { 
    // look for palindrome in the range (start) to (stop - 1) 
    for (int i = 0; i < (stop-start)/2; ++i) { 
     if (toUpper(s[start + i]) != toUpper(s[stop - 1 - i])) { 
      return false; 
     } 
    } 
    return true; 
} 

int main() { 
    string line; 
    int counter=0; 
    cout << "Please input a sentence." << endl; 
    getline(cin, line); 
    int wordStart = findNextLetter(line, 0); 
    int wordEnd = findNextPunct(line, wordStart); 
    while (wordStart != line.length()) { 
     if (isPalindrome(line, wordStart, wordEnd)) 
      ++counter; 
     wordStart = findNextLetter(line, wordEnd); // find start of next word 
     wordEnd = findNextPunct(line, wordStart); // find end of next word 
    } 
    cout << "Number of Palindromes: " << counter << endl; 
} 

"ma'am"という単語がある場合を除いて、プログラムは正常に動作します。たとえば、「こんにちは、私はああです。プログラムはただ1を出力します。これは1つの回文を意味します:Aya。アポストロフィのために「奥様」は含まれていませんでした。

具体的なコードを表示するととてもうれしくなりますので、何を変更するのかがわかりやすくなります。しかし、まだ、何か助けてくれてありがとう。 :)

+0

句読点を検索することによって、入力を単語に分割します。 '' 'は句読点です。 –

+2

コードを1行ずつトレースできるデバッガにアクセスできませんか?一般的に問題がどのように解決されているのかはソースでは見えません。 – adelphus

+0

質問には関係ありませんが、あなたの 'toUpper'機能は ポータブルではありません。アルファベット文字が連続しているという保証はありません(私が最も頻繁に使用するエンコーディングにはありません)。さらに小文字の文字に ''A ' - ' a''を追加すると、 は、場合。 が動作する標準の 'isupper'を使うのはなぜでしょうか?(単一引数のバージョンを使用する場合は、最初に' unsigned char'にキャストして する必要があります)。 –

答えて

3
wordStart = findNextLetter(line, wordEnd); // find start of next word 
wordEnd = findNextPunct(line, wordStart); // find end of next word 

文字の文字の実行としての言葉を定義します。

if (isPalindrome(line, wordStart, wordEnd)) 

単語が回文であるかどうかをチェックしています。 "ma'am"は文字ではないため、単語ではありません。 "ma'am"は、と"am"の2つの単語で区切られており、区切り文字は、"'"です。

0

あなたのコードでは、すでにカンマとピリオドは無視されています。アポストロフィ、コロン、セミコロン、および他のすべての句読点を含むように拡張します。

+1

コロンとセミコロンは、単語の一部を構成しません。 –

+1

あなたはあなたです。要件が "奥さん、私はアダムだ"ということがパリンドロームと見なされるべきであれば、コードはそれに応じて変更する必要があります。 – duffymo

+0

ああ、十分です。しかし、OPが「文章中の回文の数」(倍数を意味する)であるとOPが述べているので、スパニング・ワードを許可しようとするならば、それはずっと複雑になります。単語全体を考慮する必要がありますか?あなたは、連続した言葉のすべての順列を取って、それらの回文をチェックすることになります。 –

関連する問題