Программа на C ++ Palindrome всегда дает 0 (false) в качестве проблемы вывода;Где мой код не так? - PullRequest
1 голос
/ 12 октября 2019

Проблема в том, что в результате он всегда выдает 0 (false). Возможно, проблема в функции isPalindrome, но я не могу понять, где именно. Был бы признателен, если бы кто-то помог.

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

bool isPalindrome(string word)
{
    bool result;

    for (int i = 0; i <= word.length() - 1; i++)
    {
        if (word.at(i) == word.length() - 1)
        {
            result = true;
        }
        else
        {
            result = false;
        }
        return result;
    }
}

int main()
{
    string word1;
    int count;
    cout << "How many words do you want to check whether they are palindromes: " << flush;
    cin >> count;

    for (int i = 0; i < count; i++)
    {
        cout << "Please enter a word: " << flush;
        cin >> word1;
        cout << "The word you entered: " << isPalindrome(word1);
    }
}

Ответы [ 6 ]

3 голосов
/ 12 октября 2019

Попробуйте это:

bool isPalindrome(string word)
{
    bool result = true;
    for (int i = 0; i < word.length() / 2; i++) //it is enough to iterate only the half of the word (since we take both from the front and from the back each time)
    {
        if (word[i] != word[word.length() - 1 - i]) //we compare left-most with right-most character (each time shifting index by 1 towards the center)
        {
            result = false;
            break;
        }  
    }    
    return result;
}
2 голосов
/ 12 октября 2019

В этом операторе

if (word.at(i) == word.length() - 1)

правое выражение оператора сравнения никогда не изменяется и имеет тип std::string::size_type вместо типа cha r. Вы имеете в виду

if (word.at(i) == word.at( word.length() - 1 - i ))

Однако нет смысла использовать функцию-член в. Вы можете использовать индекс оператора. Например,

if ( word[i] == word[word.length() - 1 - i ] )

И цикл должен иметь итерации word.length () / 2.

Также внутри цикла вы перезаписываете переменную result. Таким образом, вы всегда возвращаете последнее значение переменной. Может быть равно true, хотя строка не является палиндромом.

Также параметр должен быть ссылочным типом. В противном случае создается избыточная копия переданного аргумента.

Функция может быть определена следующим образом

bool isPalindrome( const std::string &word )
{
    std::string::size_type i = 0; 
    std::string::size_type n = word.length();

    while ( i < n / 2 && word[i] == word[n - i - 1] ) i++;

    return i == n / 2;
}

Другой подход заключается в следующем

bool isPalindrome( const std::string &word )
{
    return word == std::string( word.rbegin(), word.rend() );
}

Хотя этоПодход требует создания обратной копии исходной строки.

Самый простой способ - использовать стандартный алгоритм std::equal. Вот демонстрационная программа

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

bool isPalindrome( const std::string &word )
{
    return std::equal( std::begin( word ), 
                       std::next( std::begin( word ), word.size() / 2 ),
                       std::rbegin( word ) );
}

int main() 
{
    std::cout << isPalindrome( "123454321" ) << '\n';

    return 0;
}
0 голосов
/ 12 октября 2019

Надеюсь, этот вам тоже поможет (исправлены и предупреждения):

bool isPalindrome(string word)
{
    bool result = false;

    int lengthWord = (int)word.length();

    for (int i = 0; i <= (lengthWord / 2); ++i)
    {
        if (word.at(i) == word.at(lengthWord - i -1))
        {
            result = true;
            continue;
        }
        result = false;
    }
    return result;
}
0 голосов
/ 12 октября 2019

Как обсуждено в комментариях под вашим вопросом. Вы сделали несколько ошибок в коде.

Ваша функция должна выглядеть примерно так:

bool isPalindrome(string word) { 

    bool result = true; 

    for (int i = 0; i <= word.length() - 1; i++)
    { 
        if (word.at(i) != word.at(word.length() - 1 -i))     
        { 
            return false; 
        } 
    } 
    return result;
}
0 голосов
/ 12 октября 2019

Две возможные проблемы.

Вы, кажется, сравниваете символ с числом

if (word.at(i) == word.length() - 1)

не должно ли это быть

if (word.at(i) == word.at(word.length() - i))?

В операторе if есть 3 возврата, поэтому независимо от результата, он будет сравнивать только один символ перед возвратом к вызывающей функции.

В качестве методики повторяющиеся вызовы .length внутри цикла, который всегда возвращает одно и то же значение, тратят время и затрудняют понимание кода.

Вам необходимо вернутьсякак только вы найдете несоответствие. Если вы ищете палиндром, вам нужно только сравнить первую половину слова со второй половиной в обратном порядке. Что-то вроде

bool isPalindrome(string word)
{
    for (int i = 0, j= word.length() - 1; i<j; i++, j--)
    // i starts at the beginning of the string, j at the end.
    // Once the i >= j you have reached the middle and are done.
    // They step in opposite directions
    {
        if (word[i] != word[j])
        {
            return false;
        }              
    }
    return true;
}
0 голосов
/ 12 октября 2019

Цикл в функции isPalindrome будет выполняться только один раз, поскольку оператор return безусловно выполняется на первой итерации цикла. Я уверен, что это не предназначено.

Чтобы определить, является ли строка палиндромом, цикл должен быть выполнен несколько раз. Только после того, как последний символ будет оценен (в последней итерации цикла), будет время использовать оператор return, если только вы заранее не определите, что строка не является палиндромом.

Кроме того, в функцииisPalindrome, следующая строка является бессмысленной, поскольку вы сравниваете ASCII-код буквы с длиной строки:

word.at(i) == word.length() - 1

Поэтому я предлагаю следующий код для функции:

bool isPalindrome(string word)
{
    for (int i = 0; i < word.length() / 2; i++)
    {
        if (word.at(i) != word.at( word.length() - i - 1) ) return false;
    }

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