Подсчет количества палиндромов в предложении - PullRequest
1 голос
/ 25 января 2012

Добрый день всем!Ниже приведена программа, которая запрашивает у пользователя предложение и выводит в нем количество палиндромов.

#include<iostream>
#include<string>
#include<sstream>

using namespace std;

bool isPalindrome (const std::string& s) {
    for (int i = 0; i < (s.length())/2; ++i) {
        if (s[i] != s[s.length()-1 - i])
            return false;
        else
            return true;
    }
}


int main() {
    string sentence;
    int counter=0;
    cout << "Please input a sentence." << endl;
    getline(cin, sentence);
    stringstream processtokens(sentence);
    for(string word; processtokens >> word;) 
        if(isPalindrome(word)) 
            ++counter;
    cout << "Number of Palindromes are : " << counter << endl;
}

Работает просто отлично.Но, например, когда я ввожу «Быстрая коричневая затычка с голубым глазом», число палиндромов, отображаемых программой, составляет всего 1, но на самом деле предложение имеет 2 палиндрома: затычка и глаз.Проблема в том, что у слова «глаз» есть точка.Так как же программа может игнорировать точку и другие знаки препинания, такие как запятая, когда, например, пользователь вводит «Я люблю полдень, вечер и полночь».Полдень - это палиндром, но программа не распознает его из-за запятой.

Другая проблема - это заглавные буквы.Я хочу, чтобы эта программа работала (и игнорировала эквиваленты ASCII), когда пользователь ввел «Мадам, моя работа выполнена».Я знаю, что это как-то связано с tolower .

Подводя итог, я хочу, чтобы эта программа имела функцию , которая a) игнорирует знаки пунктуации и б) заглавные буквы .

И, о-о, какова альтернатива "процессам строки потока (предложение); ..."?Скорее, мне нужна эта программа, чтобы использовать substring (substr) и найти .

Пожалуйста, помогите мне, ребята!Спасибо и любая помощь очень ценится.Еще раз спасибо и хорошего дня!

Ответы [ 3 ]

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

Вы можете использовать ispunct и игнорировать любые символы, где ispunct возвращает true. Вы также должны обернуть сравнения своих персонажей в вызовы tolower ()

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

Может быть, это небольшое упражнение можно использовать для представления некоторых полезных функций C ++, таких как итераторы:

inline bool is_letter(char c)
{ return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); }


bool is_palindrome(const std::string & s)
{
    std::string::const_iterator it = s.begin();
    std::string::const_reverse_iterator rt = s.rbegin();

    while (it != s.end() && rt != s.rend() && std::distance(it, rt.base()) > 0)
    {
        // Skip non-letters
        while (it != s.end() && !is_letter(*it)) { ++it; }
        while (rt != s.rend() && !is_letter(*rt)) { ++rt; }

        if (it == s.end() || rt == s.rend()) { break; }

        // Check palindromy
        if (std::tolower(*it) != std::tolower(*rt)) { return false; }

        // Move on
        ++it;
        ++rt;
    }

    return true;
}

Хитрость в том, чтобы атаковать строку с обоих концов. Для этого у нас есть обычный итератор, it, идущий с начала строки, и обратный итератор, rt, идущий с конца строки.

Суть кода - проверка палиндромии (без учета регистра, путем сравнения символов в нижнем регистре) и немедленного return false даже при сбое; в противном случае два итератора продвигаются на один.

Наконец, начало цикла поглощает не-буквенные символы из строки, поэтому они игнорируются. Мы снова проверяем, достигли ли мы конца строки после сожрания; Вы должны убедиться, что вы разыменовываете итератор только для допустимого элемента!

Цикл останавливается, когда движущийся вперед итератор проходит мимо движущегося назад. Это содержание условия distance(it, rt.base()) > 0: «основа» обратного итератора фактически является обычным итератором для элемента после элемента обратного итератора. Таким образом, it не пересек rt, пока расстояние от it до основания rt строго больше нуля. (Расстояние равно 1, когда it и rt относятся к одному и тому же элементу.)

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

Я думаю, что есть функция для проверки пунктуации. Вы можете попробовать ispunct

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...