bornman Posted February 22, 2018 at 02:06 PM Share Posted February 22, 2018 at 02:06 PM 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 More sharing options...
Administrators Fernando Mercês Posted February 22, 2018 at 02:55 PM Administrators Share Posted February 22, 2018 at 02:55 PM 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 More sharing options...
bornman Posted February 22, 2018 at 03:48 PM Author Share Posted February 22, 2018 at 03:48 PM 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 More sharing options...
Administrators Fernando Mercês Posted February 22, 2018 at 05:35 PM Administrators Share Posted February 22, 2018 at 05:35 PM 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 More sharing options...
bornman Posted February 22, 2018 at 06:46 PM Author Share Posted February 22, 2018 at 06:46 PM 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 More sharing options...
gzn Posted February 22, 2018 at 07:54 PM Share Posted February 22, 2018 at 07:54 PM 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 to comment Share on other sites More sharing options...
fredericopissarra Posted March 15, 2018 at 02:14 PM Share Posted March 15, 2018 at 02:14 PM 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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.