Jump to content
Sign in to follow this  
bornman

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

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.");
}

 

Edited by bornman

Share this post


Link to post
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

Share this post


Link to post
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?

Edited by bornman

Share this post


Link to post
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!

Share this post


Link to post
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.");
    }
}

 

Share this post


Link to post
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:

Edited by gzn

Share this post


Link to post
Share on other sites

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?

Edited by fredericopissarra
  • Agradecer 2

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...