bornman Postado Fevereiro 22, 2018 em 14:06 Compartilhar Postado Fevereiro 22, 2018 em 14:06 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 para o comentário Compartilhar em outros sites More sharing options...
Fernando Mercês Postado Fevereiro 22, 2018 em 14:55 Compartilhar Postado Fevereiro 22, 2018 em 14:55 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 para o comentário Compartilhar em outros sites More sharing options...
bornman Postado Fevereiro 22, 2018 em 15:48 Autor Compartilhar Postado Fevereiro 22, 2018 em 15:48 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 para o comentário Compartilhar em outros sites More sharing options...
Fernando Mercês Postado Fevereiro 22, 2018 em 17:35 Compartilhar Postado Fevereiro 22, 2018 em 17:35 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 para o comentário Compartilhar em outros sites More sharing options...
bornman Postado Fevereiro 22, 2018 em 18:46 Autor Compartilhar Postado Fevereiro 22, 2018 em 18:46 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 para o comentário Compartilhar em outros sites More sharing options...
gzn Postado Fevereiro 22, 2018 em 19:54 Compartilhar Postado Fevereiro 22, 2018 em 19:54 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? Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Março 15, 2018 em 14:14 Compartilhar Postado Março 15, 2018 em 14:14 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 para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Arquivado
Este tópico foi arquivado e está fechado para novas respostas.