Jump to content

Ajuda com programa para verificar se palavra é palíndromo [C++]


bornman

Recommended Posts

Olá, estou fazendo um programa com uma classe para verificar se a palavra digitada é palíndromo, porém estou tendo dificuldades com a função bool. Tentei usar strlen() para verificar o tamanho da string mas não deu certo, então achei essa verificação na internet e implementei no programa. Está dando erro out_of_range mas não entendo o motivo.
Segue o código completo:

 

#include <iostream>
#include <string.h>

using namespace std;

class Polindrome{
public:
    std::string word;


    bool static isPolindrome(std::string word){
        for (int i = 0; i<= word.size(); i++)
        {
            if (word.at(i) != word.at(word.size()-i))
            {
                return false;
            }
        }

    }


};

int main()
{
    Polindrome p;
    cout << "Digite uma palavra para ser verificada: ";
    cin >> p.word;



    if (isPolindrome(p.word))
        printf("Eh palindromo.");
        else
        printf("Nao eh palindromo.");
}

 

Link to comment
Share on other sites

Opa, beleza?

O seu loop tá iterando até "menor ou igual o tamanho da string", logo, se você inserir a string radar, tem que tamanho 5, o teu loop vai tentar acessar o elemento word.at(5), que não existe - lembra que os arrays começam em 0? Logo, a string radar tem elementos indexados de 0 à 4, totalizando 5 elementos.

Pensa aí, não quero te dar a solução pra não atrapalhar teu aprendizado.

Vai ter que corrigir na comparação dentro do loop também.

Adicionalmente, você tá declarando funções/métodos com um tipo de retorno int (a main() e a isPolindrome()), mas não tá deixando um valor padrão a ser retornado nelas.

A identação pode melhorar também. ;)

Abraço,

Fernando

Link to comment
Share on other sites

59 minutos atrás, Fernando Mercês disse:

Opa, beleza?

O seu loop tá iterando até "menor ou igual o tamanho da string", logo, se você inserir a string radar, tem que tamanho 5, o teu loop vai tentar acessar o elemento word.at(5), que não existe - lembra que os arrays começam em 0? Logo, a string radar tem elementos indexados de 0 à 4, totalizando 5 elementos.

Pensa aí, não quero te dar a solução pra não atrapalhar teu aprendizado.

Vai ter que corrigir na comparação dentro do loop também.

Adicionalmente, você tá declarando funções/métodos com um tipo de retorno int (a main() e a isPolindrome()), mas não tá deixando um valor padrão a ser retornado nelas.

A identação pode melhorar também. ;)

Abraço,

Fernando

Obrigado @Fernando Mercês, consegui arrumar boa parte dos erros, o código ficou assim: 

#include <iostream>
#include <string.h>

using namespace std;

class Polindrome{
	public:
   		 std::string word;
  
   			 bool static isPolindrome(std::string word){
   			     for (int i = 0; i<word.size(); i++)
    		    {
          		  if (word.at(i) != word.at(word.size()-i-1))
           		 {
              	  		return false;
           		 } else
          		  {
                		return true;
           		 }
      	  }
    }
};

int main()
{
    Polindrome p;
    cout << "Digite uma palavra para ser verificada: ";
    cin >> p.word;

    
    if (Polindrome::isPolindrome(p.word)){
        printf("Eh palindromo.");
    }
        else{
        printf("Nao eh palindromo.");
    }
}

Não entendi o por que do -1 nessa parte: if (word.at(i) != word.at(word.size()-i-1)) , seria por causa do ultimo carácter que indica o fim da string(\0)? E o meu loop só está comparando a primeira letra com a última letra, então acredito que eu deva trocar no loop o return true por i++, correto? Porém como eu faço ele retornar true apenas quando ele terminar de comparar todas as letras?

Link to comment
Share on other sites

1 hora atrás, bornman disse:

Não entendi o por que do -1 nessa parte: if (word.at(i) != word.at(word.size()-i-1))

Ué, você escreveu e não entendeu? Como assim? rsrs

Pensa aí que valor terá nas tuas "variáveis" no teu loop, dependendo do valor de i. Algo como:

Entrada é a string "bacon"

Para i=0:
word.at(0) é 'b'
word.at(0) != word.at(5 - 0 - 1)
wrod.at(0) != word.at(4) // que é 'n'
  
Para i=1:
word.at(1) é 'a'
word.at(1) != word.at(5 - 1 - 1)
wrod.at(1) != word.at(3) // que é 'o'
  
  ...

 

1 hora atrás, bornman disse:

como eu faço ele retornar true apenas quando ele terminar de comparar todas as letras

Coloca o return true fora do bloco do loop. Assim se ele achar uma letra diferente, já retorna falso. Se o loop acabar e não retornar falso, é só retornar true.

Resolve esse problema primeiro e quando conseguir avisa, porque tem mais coisa pra melhorar nesse código e ele pode ficar ainda mais legal. :)

Grande abraço!

Link to comment
Share on other sites

Obrigado novamente @Fernando Mercês, entendi o motivo do -1.  Agora o programa está funcionando corretamente, segue o código: 
 

#include <iostream>
#include <string.h>

using namespace std;

class Polindrome{
	public:
   		 std::string word;
  
   			 bool static isPolindrome(std::string word){
   			     for (int i = 0; i<word.size(); i++)
    		    {
          		  if (word.at(i) != word.at(word.size()-i-1))
           		 {
              	  		return false;
           		 } 
           		 }
          		  
            return true;
    }
};

int main()
{
    Polindrome p;
    cout << "Digite uma palavra para ser verificada: ";
    cin >> p.word;

    
    if (Polindrome::isPolindrome(p.word)){
        printf("Eh palindromo.");
    }
        else{
        printf("Nao eh palindromo.");
    }
}

 

Link to comment
Share on other sites

O -1 é porque a última posição começa em word.size() - 1.

Você compara os primeiros com os últimos, nesse sentido de comparação. No início você começa com 0 e vai até a última posição (word.size() - 1).

Hehe, to aproveitando para ver como é esse negócio de C++. Eu sei um poquito de Java. Só não to entendendo uma coisa, não estou achando a palavra-chave new! Não tem que usa ela pra instancia classe não?:ph34r:

Link to comment
Share on other sites

  • 3 weeks later...

Não é C++, mas é C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
  char *line, *p;
  size_t len, size, i;

  fputs("Verifica se palavra ou frase constitui um palíndromo.\n"
        "Algumas cossiderações são necessárias:\n\n"
        "\t1) Acentuação causa problemas, de acordo com o modelo de codificação.\n"
        "\t   UTF-8, por exemplo usa 2 bytes para o caracter 'é'. Neste caso, a\n"
        "\t   frase \"roma é amor\" NÃO será um palíndromo.\n\n"
        "\t2) Este programa não trata pontuação\n\n"
        "\t3) Também não desconsidera espaços.\n\n"
        "Isso implica que o palíndromo abaixo NÃO será um palíndromo:\n\n"
        "\t   \"Luza Rocelina, a namorada do Manuel, leu na moda da Romana: Anil é cor azul\"\n\n"
        "Palavra/Frase: ", stdout); fflush(stdout);

  line = NULL; size = 0;
  if ((len = getline(&line, &size, stdin)) == -1)
  {
    fputs("ERRO alocando espaço para a string.\n", stderr);
    return 1;
  }

  if (p = strchr(line, '\n')) { *p = '\0'; len = p - line; }

  printf("A sentença '%s' ", line);

  for (i = 0; i < len / 2; i++)
    if (line[i] != line[len-i-1])
    {
      fputs("NÃO ", stdout);
      break;
    }

  free(line);
  puts("é palíndromo");
  return 0;
}

Serve assim?

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...