Когда я ввожу слово «мэм», программа не считает его палиндромом. - PullRequest
0 голосов
/ 25 января 2012

У меня есть программа, которая выводит количество палиндромов в предложении.Не учитывает регистр и игнорирует запятую и периоды, когда, например, палиндром оказывается последним словом в предложении.

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

Программа работает правильно, за исключением случаев, когда есть слово "мэм".Например, когда «Привет, мэм! Я Ая».программа выводит только 1, что означает один палиндром: Aya.«Мэм» не было включено из-за апострофа.

Я буду очень рад, если вы покажете мне конкретный код, так что мне будет легко понять, что изменить.Но, тем не менее, я благодарю вас за любую помощь.:)

Ответы [ 2 ]

3 голосов
/ 25 января 2012
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" - это два слова "ma" и "am", разделенные знаком пунктуации, "'".

0 голосов
/ 25 января 2012

Ваш код уже игнорирует запятые и точки; расширить его, чтобы включить апострофы, двоеточия, точки с запятой и все другие формы пунктуации.

...