文章中の回文の数を出力するプログラムがあります。大文字と小文字を区別せず、カンマやピリオドを無視します。たとえば、回文が文の最後の単語であるとします。「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。アポストロフィのために「奥様」は含まれていませんでした。
具体的なコードを表示するととてもうれしくなりますので、何を変更するのかがわかりやすくなります。しかし、まだ、何か助けてくれてありがとう。 :)
句読点を検索することによって、入力を単語に分割します。 '' 'は句読点です。 –
コードを1行ずつトレースできるデバッガにアクセスできませんか?一般的に問題がどのように解決されているのかはソースでは見えません。 – adelphus
質問には関係ありませんが、あなたの 'toUpper'機能は ポータブルではありません。アルファベット文字が連続しているという保証はありません(私が最も頻繁に使用するエンコーディングにはありません)。さらに小文字の文字に ''A ' - ' a''を追加すると、 は、場合。 が動作する標準の 'isupper'を使うのはなぜでしょうか?(単一引数のバージョンを使用する場合は、最初に' unsigned char'にキャストして する必要があります)。 –