Программа, чтобы узнать, является ли слово палиндром - PullRequest
1 голос
/ 26 апреля 2020

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

#include <iostream>
#include <cstring>


using namespace std;

int main(){
    //take input
    string input;
    cout << "Enter your word: ";
    cin >> input;

    //initialize arrays and variables
    int counter = 0, k = 0;
    int char_length = input.length();
    char characters[char_length];
    strcpy(characters, input.c_str());//copy the string into char array

    //index of character at the midpoint of the character array
    int middle = (char_length-1)/2;
    int booleans[middle]; //to keep 1's and 0's

    //check the characters
    int m = 0, n = char_length-1;
    while(m < middle && n > middle){
        if(characters[m] == characters[n]){
                booleans[k] = 1;
            } else {
                booleans[k] = 0;
            }
            k++;
            m++;
            n--;
    }

    //count number of 1's (true for being equal) in the booleans array
    for(int i = 0; i < sizeof(booleans)/sizeof(booleans[0])-1; i++){
        counter += booleans[i];
    }

    //compare 1's with size of array
    if(counter == middle){
        cout << input << " is a Palindrome!" << endl;
    } else {
        cout << input << " is not a Palindrome!" << endl;
    }

    return 0;
}

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

Если вы получили несоответствие, т.е. (characters[m] == characters[n]) ложно, то у вас нет палиндрома. Вы можете сломать l oop в этот момент, возвращая false как ваш результат. Вы не делаете этого, вместо этого вы продолжаете тестирование, когда результат уже известен. Я бы сделал что-то вроде:

// Check the characters.
int lo = 0;
int hi = char_length - 1;
int result = true;  // Prefer "true" to 1 for better readability.
while (lo < hi) {   // Loop terminates when lo and hi meet or cross.
  if(characters[lo] != characters[hi]) {
    // Mismatched characters so not a palindrome.
    result = false;
    break;
  }
  lo++;
  hi--;
}

Я сделал несколько улучшений стилиста c, а также очистил логи c. Вы проделали слишком много работы, чтобы решить проблему.

Кроме того, вам не нужно проверять, равны ли два указателя lo и hi, потому что тогда они оба указывают на середину. символ слова с нечетным количеством букв. Поскольку этот символ должен быть равен самому себе, нет необходимости проверять. Следовательно, < в условии l oop, а не <=.

0 голосов
/ 26 апреля 2020

Существующий код не работает для палиндромов нечетной длины из-за

for(int i = 0; i < sizeof(booleans)/sizeof(booleans[0])-1; i++)

Либо используйте i<=sizeof(booleans)/sizeof(booleans[0])-1; или i<sizeof(booleans)/sizeof(booleans[0]);.

В настоящее время вы не считая сравнения character[middle-1] и character[middle+1].

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

#include <iostream>
#include <cstring>


using namespace std;

int main(){
    //take input
    string input;
    cout << "Enter your word: ";
    cin >> input;

    //initialize arrays and variables
    int counter = 0, k = 0;
    int char_length = input.length();
    char characters[char_length];
    strcpy(characters, input.c_str());//copy the string into char array

    //index of character at the midpoint of the character array
    int middle = (char_length+1)/2;
    int booleans[middle]; //to keep 1's and 0's

    //check the characters
    int m = 0, n = char_length-1;
    while(m<=n){
        if(characters[m] == characters[n]){
                booleans[k] = 1;
            } else {
                booleans[k] = 0;
            }
            k++;
            m++;
            n--;
    }

    //count number of 1's (true for being equal) in the booleans array
    for(int i = 0; i < sizeof(booleans)/sizeof(booleans[0]); i++){
        counter += booleans[i];
    }
    cout<<counter<<" "<<middle<<endl;
    //compare 1's with size of array
    if(counter == middle){
        cout << input << " is a Palindrome!" << endl;
    } else {
        cout << input << " is not a Palindrome!" << endl;
    }

    return 0;
}

Здесь размер логического массива равен (длина + 1) / 2,

Для строки s, такой как abcba, она будет иметь длину 3.

Это соответствует сравнению a a, b b и c c. Поскольку средний элемент одинаков, условие всегда выполняется для этого случая.

Более того, понятие середины удалено, и указатели просят двигаться, пока они не пересекут друг друга.

0 голосов
/ 26 апреля 2020

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

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    char str1[20], str2[20];
    int i, j, len = 0, flag = 0;
    cout << "Enter the string : ";
    gets(str1);
    len = strlen(str1) - 1;
    for (i = len, j = 0; i >= 0 ; i--, j++)
        str2[j] = str1[i];
    if (strcmp(str1, str2))
        flag = 1;
    if (flag == 1)
        cout << str1 << " is not a palindrome";
    else
        cout << str1 << " is a palindrome";
    return 0;
}

Она будет работать в любом случае, который вы можете попробовать.

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