paulo1205
(usa Ubuntu)
Enviado em 15/11/2014 - 15:05h
schodinger escreveu:
Apesar de sua asneira, seu programa está ótimo. Mas, não está de acordo com o pedido!
Aponte a asneira.
O que ele pede é:
Faça um script que verifique se um nome é um palíndromo. Uma palavra é um palíndromo se a sua leitura é a mesma da esquerda para a direita e vice versa. Dica: use um "array" para armazenar a palavra. Exemplo: ARARA, ANA, etc.
Note que você também não seguiu a dica, pois o enunciado sugere usar _um_ array, e você usou dois.
De todo modo, "dica" é diferente de obrigação. Uma coisa é dizer "faça isto usando arrays"; outra, "faça isto; minha dica é usar um array".
Além do mais, a dica dada é essencialmente ruim:
1) Para começar, strings já são uma forma de array na grande maioria das linguagens de programação. No Bash tal semelhança também é verdadeira, pois os elementos (caracteres) são dispostos em posições adjacentes de memória é possível ter acesso individualizado a cada um deles, ainda que somente de leitura.
2) Usar o que o Bash chama de array implica separar todos os caracteres do string original só para depois juntar todos novamente em posições adjacentes, só que numa outra forma, com outra notação (reforçando a razão (1)).
3) Não existe uma operação nativa com arrays do Bash que, para o problema dado, facilite a implementação. Se for para usar -- ou abusar de -- comandos externos, que se use logo o “rev”, como você mesmo sugeriu inicialmente, e que se resolva o problema numa só linha.
[[ "$palavra" = "$(echo "$palavra" | rev)" ]] && echo "E palindromo" || echo "Nao e palindromo"
Seu programa está muito complicado para um usuário que está aprendendo shell!!
Fique à vontade para “descomplicá-lo”. Se o problema for:
- o loop que permite avaliar várias palavras numa execução só do script: basta remover a primeira e as duas últimas linhas;
- a notação aritmética do Bash: realmente um horror, mas é culpa do Bash, não minha (quem sabe trocando a linguagem de script para Python, Perl ou Ruby?);
- a notação do Bash para seleção de caráter dentro do string: também não é culpa minha, mas é comparativamente mais sucinta (e limpa) do que outras linguagens, como AWK ou Perl;
- o uso de operadores de pós-incremento e pós-decremento no meio da expressão: troque a expressão para avaliação simples de variável, e coloque o incremento e o decremento como operações à parte após o fim do
if;
- a conversão de todas as letras para minúsculas antes de iniciar os testes de palíndromo: suprima, se quiser, mas o enunciado fala em _nome_, e eu entendo que "Ana" é tão palíndromo quanto "ANA" ou "ana", e que deveria ser indicado como tal.
Ou será que não leu:
Fala pessoal , Então "não tenho muito conhecimento em shell" e preciso fazer este exercicio abaixo.
Eu li sim, e muito bem. Vi, por exemplo, a referência a nome, que me fez optar por tratar minúsculas e maiúsculas como equivalentes. Vi também que o autor trazia praticamente pronto um algoritmo essencialmente correto, embora numa linguagem meio confusa (que parecia misturar shell com C, Pascal ou Python) e testando mais valores do que o estritamente necessário. Vi ainda que, quando nosso colega pediu para fazer sem o “rev”, pediu para que fosse feita uma comparação individual de elementos.
Eu discordo veementemente da postura de ensinar a fazer de modo ineficiente só porque quem está aprendendo supostamente não tem condições de compreender e aprender a forma mais refinada. Ser aprendiz não significa que é preguiçoso ou bur
ro.
Como eu disse acima, ele praticamente acertou a ideia, errando apenas em expressá-la. Ainda que ignorasse sintaxe -- e suponho que foi por isso que veio aqui --, fez o mais difícil, mostrando que não é bur
ro. E se não for preguiçoso, ao encontrar alguma coisa que não entenda no que você ou eu dissemos, pode perguntar de novo. De minha parte, estou predisposto a responder.
Como você respondeu descartando todo o esforço do colega e, depois, quando ele pediu que se mostrassem operações individualizadas (resgatando seu esforço original), respondeu novamente com uma forma de comparação fechada de strings (que é obviamente individualizada caráter a caráter, mas fora da visão do programa), acho que quem não andou lendo direito foi você.
Então, o uso de vetores fica mais simples(é um programa besta, mas é simples pra que está aprendendo)!!!
Simples foi sua primeira sugestão, usando “rev”. Como ela não pôde ser usada, não enxergo, no contexto do problema dado, simplicidade essencial no uso de arrays do Bash, tanto por razões estéticas como por tudo o que eu disse acima.
Veja todo o trabalho que você teve para, com auxílio (desnecessário) de programas externos, formar os arrays por meio da (artificiosa) divisão da palavra e inversão do primeiro array no segundo (que você poderia ter evitado se tivesse formado o array invertido no mesmo loop do array direto). Isso para, no fim das contas, juntar os dois novamente em strings e comparar esses dois strings como objetos elementares. Realmente acha isso didático?
Eu não acho.