Invertendo strings usando vetores

Publicado por maxshu (última atualização em 17/11/2014)

[ Hits: 5.714 ]

Homepage: programacaocomputador.blogspot.com.br

Download man2_test.sh




Hoje trago um simples inversor de strings, mas que possui alguns comandos avançados.
Um colega deste site (truster0) perguntou o seguinte:

    Fala pessoal, então não tenho muito conhecimento em shell e preciso fazer este exercicio abaixo:

    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.

    Me arrisquei e deu isso mas está dando erro:

    #!/bin/bash

    echo "Digite a palavra a ser testada"
    read palavra

    for ((i=o ; i<=tamanho ; i++))do
    if ((palavra=palavra[((tamanho-1)-i))]
    verifica=1

    if(verifica -eq 0)then
    echo "Igual de tras pra frente"
    else
    echo "Diferente de tras pra frente"
    fi

No tópico: http://www.vivaolinux.com.br/topico/Shell-Script/Ajuda-com-Shell-Script-7

Então, mandei uma resposta pro problema:

#!/bin/bash

read -p "Digite a palavra a ser testada: " palavra

reverse="$(echo $palavra | rev)"

if [ "$reverse" = "$palavra" ]
then {
echo "Igual de tras pra frente"
}
else {
echo "Diferente de tras pra frente"
}
fi

Este é um script simples, pois usa comandos conhecidos do shell Linux. Mas o colega, não conformado com a solução, pediu que o script fosse iterado caractere por caractere. Então, resolvi elaborar um script mais avançado.

Pessoal, este script é muito simples, mas poderoso quando queremos compara caracteres individuais.

  



Esconder código-fonte

#!/bin/bash

read -p "Digite a palavra a ser testada: " palavra

cont0=1
cont1=$(echo  $palavra | wc -m)
contchar=$(echo "$cont1-$cont0" | bc)


for(( i=1; i <= $contchar; i++ ))
  do
  c1[$i]=$(echo "$palavra" | cut -b $i)
done

h=$(echo "$contchar+$cont0" | bc)
for(( k=1; k<=$contchar; k++ ))
  do
  j=$(echo "$h-$k" | bc)
  c2[$j]=$(echo ${c1[$k]})
done

if [ "$(echo ${c2[@]})" == "$(echo ${c1[@]})" ]
then {
echo "Igual de tras pra frente"
}
else {
echo "Diferente de tras pra frente"
}
fi

Scripts recomendados

Samba

Atualizando se Slackware

Criando Autoridades Certificadoras e Certificados de Testes no Linux

Diferença entre datas

Testa se há conexão com a internet (Funciona)


  

Comentários
[1] Comentário enviado por elgio em 17/11/2014 - 16:43h

Não resisti...

#!/bin/bash

read -p "Digite a palavra a ser testada (sem acentos): " palavra

palavraMAI=$palavra

# Converte tudo para maiusculas
palavraMAI=${palavra^^}

# Eliminando pontuacoes e espacos em branco
palavraMAI=${palavraMAI//[^A-Z]}


echo "DEBUG: usando a string \"$palavraMAI\""

# quantas letras tem a frase/palavra?
t="${#palavraMAI}"

# Só preciso comparar até a metade das letras
meio="$(( t / 2 ))"

# Um laco até a metade das letras
for (( i=0,j=1; i<=meio;i++,j++))
do
# C1 terá um caracter a partir de $i. Forma de pegar caracter por caracter
C1=${palavraMAI:$i:1}

# C2 terá um caracter a partir de -$j no fim. Se j for 1, pegará
# o último caracter. -2, o penúltimo e assim por diante
C2=${palavraMAI: -$j:1}

# Uma impressão de depuracao
printf "%3d [%1s] [%1s]\n" $i "$C1" "$C2"

# basta que um caracter não seja igual ao seu reverso para dizer que
# não é palíndromo. Então, se um não for, encerra.
if [ "$C1" != "$C2" ]
then
echo "Não é palíndromo"
exit 0
fi
done

# Chegou até aqui sem sair no exit? Então é palíndromo
echo "Eh um palíndromo"

[2] Comentário enviado por iagolira em 12/12/2014 - 08:31h

Legal...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts