bornman Posted February 22, 2018 Posted February 22, 2018 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."); }
Administrators Fernando Mercês Posted February 22, 2018 Administrators Posted February 22, 2018 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
bornman Posted February 22, 2018 Author Posted February 22, 2018 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?
Administrators Fernando Mercês Posted February 22, 2018 Administrators Posted February 22, 2018 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!
bornman Posted February 22, 2018 Author Posted February 22, 2018 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."); } }
gzn Posted February 22, 2018 Posted February 22, 2018 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?
fredericopissarra Posted March 15, 2018 Posted March 15, 2018 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?
Recommended Posts
Archived
This topic is now archived and is closed to further replies.