Desafio: Ordenar números digitados [RESOLVIDO]

1. Desafio: Ordenar números digitados [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/09/2011 - 11:00h

Estou recebendo a ajuda de um colaborador do VOL que me passou a tarefa conforme segue.
Tem duas pendências não resolvidas, mas o que foi solicitado já está feito.
Quem puder testar ou completar as pendências....
Vou enviar no futuro para o setor de Scripts do VOL.
Colocarei os Créditos para quem completar as pendências também.
=============================================================

#!/bin/bash
# file: ordenar.sh
# Script coleta digitação de números válidos.
# Deve aguardar a digitação de cada número. Teclar enter salva o número.
# Após digitação pode solicitar a ordenação O(Ordenar)
# Opcionalmente pode escolher sair com a letra S (sair)
# Da série: Aprendendo a aprender. Treinamento de Shell Script.
# TODO: Falta salvar a digitação após sair.
# FIXME: Não trabalha em linha de comando via parâmetros de entrada, exemplo:
# FIXME: ordenar.sh 12 32 43 64 1 2 3 4
# FIXME: ONDE deveria retornar já tudo ordenado na saída.
# FIXME: Próxima versão deve permtir a passagem de parametros conforme acima.
#
# variáveis globais
escolha=""
numero=""
digitando[0]="0" # Array que irá conter números digitados.
contador="0" # Contador que será usado no array.
start="0" # Controla se já tem algum tipo de digitação.

# Inicializa a digitação já efetuada e começa tudo novamente.
function inicializa()
{
unset digitando # Inicializando o array.
unset contador
unset start
contador="0"
start="0"
}
# Só vai mostrar o que já foi digitado para ir acompanhando.
function digitado()
{
if [ $start = "0" ]
then
start="1"
return
fi
echo "Já digitado até o momento...: ${digitando[@]} "
}

# Valor digitado no momento.
function digitei()
{
# Salva o novo valor digitado. Não importa se é repetido ou não.
digitando["$contador"]="$1"

# Faz incremento do contador para o próximo passo.
let contador++

}

# Somente mostra o menu. Se receber uma parâmetro, mostra digite.
function mostramenu()
{
clear
echo "========================================"
echo "Menu Principal"
echo "========================================"
echo ""
echo "d - Digitar números"
echo "o - Ordenar digitação"
echo "i - Inicializa digitação"
echo "s - Sair"
echo "h - Ajuda"
echo ""
if [ "$1" ]; then echo -n "Escolha a opção:" ; fi

}

# Fornece ajuda simples ao protosuário
function ajuda()
{
clear
mostramenu
echo ""
echo "Você só pode digitar as opções d,o,s ou h"
echo "Tente novamente seu protosuário nó cego !!!"
echo ""
read -t 5
clear
mostramenu
return
}

# Informa algum tipo de erro durante a utilização.
# Mensagem é genérica.
# TODO: Futuramente pode ser tratada para responder ao contexto.
function erro()
{
clear
echo ""
echo "Opção digitada é inválida"
echo "Precisa de ajuda ? use o help"
echo ""
read -t 2
}

# Recebe a digitação dos números.
# Se digitar algo inválido, mostrará erro genérico.
# Se escolher alguma opção válida, vai executa-la.
function digitar()
{
while true
do
clear
mostramenu
digitado
echo ""
echo -n "Digite os números desejados...:"
read numero
if test $numero -gt 0
then
digitei $numero
digitado
else
case "$numero" in
o) ordenar ;;
s) sair ;;
i) inicializa ;;
h) ajuda ;;
*) erro
mostramenu
;;
esac
fi 2> /dev/null
done
}

# Ainda não está sendo usada.
# Será necessária quando for camada via linha de comando.
function imprimir()
{
echo ${digitando[*]}
}

# Faz a ordenação da digitação até o momento.
# Deve mostrar o conteúdo digitado e os valores orenados.
function ordenar()
{
# ordenando o que já foi digitado.
for (( last=contador-1;last>0;last--))
do
for((i=0;i<last;i++))
do
j=$((i+1))
if [ ${digitando[i]} -gt ${digitando[j]} ]
then
exchange $i $j
fi
done
done
}

function exchange()
{
temp=${digitando[$1]}

digitando[$1]=${digitando[$2]}

digitando[$2]=$temp
}


# Sai do sistema e digitação será perdida.
# TODO: Não grava o que foi digitado.
function sair()
{
echo "Finalizando o siste bye. Digitação não foi gravada !!! "
read -t 0.2
exit
}

# Menu inicial do sistema.
# usa uma função genérica de uma parte do menu.
# Até escolhas do menu podem ser passadas a uma função para ficar mais genérico.
function _menu()
{
clear
while true
do
mostramenu normal
read escolha
case "$escolha" in
d) digitar ;;
o) ordenar ;;
s) sair ;;
h) ajuda ;;
*) erro ;;
esac
done
}

# Inicializando a manguaça ;)
function main()
{
_menu # Menu principal
}
main {@}

#-----------------------------------------------------------------------------
# Você consegue fazer ele funcionar digitando:
# ordenar.sh 34 32 12 1 98 2
# e o retorno deve ser apenas os números ordenados.
# # 1 2 12 32 34 98
# Estas alterações não podem influenciar o funcionamento normal.
#-----------------------------------------------------------------------------


off code café:






  


2. MELHOR RESPOSTA

Hudson Moreira Guimaraes dos Santos
hudyfx

(usa Outra)

Enviado em 02/09/2011 - 15:27h

#!/bin/bash
i=0
if [ $# -eq 0 ]; then
echo "nenhum argumento digitado"
else
for j in `echo $@`;do
if [ "${j//[0-9]}" ]; then
echo $j caractere difertente de numero
exit
else
matriz[$i]=$j
fi
i=$(( i + 1 ))
done
fi
for ((i=0;i<=$(($# -1 ));i++));do
for ((j=0;j<=$(($# -1 ));j++));do
if [ ${matriz[$i]} -le ${matriz[$j]} ];then
tmp=${matriz[$i]}
matriz[$i]=${matriz[$j]}
matriz[$j]=$tmp
fi
done
done
for ((i=0;i<=$(($# -1 ));i++));do
echo -n "${matriz[$i]} "
done
echo

da uma analisada e tenta comparar o codigo... ou se preferir tenta inbutir isso no seu codigo
esse script faz duas coisas.
A primeira é pegar os argumentos e verificar se vc esta digitando somente numero, por exemplo:

./teste.sh 9 8 7 6 a 4 3 2 1
a caractere difertente de numero
./teste.sh 9 8 7 6 aweqw 4 3 2 1
aweqw caractere difertente de numero

E por fim, se estivar tudo correto ele monta a matriz e ordena
./teste.sh 45 6 5 4 8 2 1 546 8 45 5 8 7 9 6 5 2 3 1 45 68 7 78 11 1116 5 11 4 66
1 1 2 2 3 4 4 5 5 5 5 6 6 7 7 8 8 8 9 11 11 45 45 45 66 68 78 546 1116

tenta ai... depois agente vai matando as duvidas

3. Re: Desafio: Ordenar números digitados [RESOLVIDO]

Hudson Moreira Guimaraes dos Santos
hudyfx

(usa Outra)

Enviado em 02/09/2011 - 11:24h

eita! o menino ta ficando bão!
perfeito.... funfo que é uma beleza...
bem dinâmico, rápido, digno de um programador shell pleno...
parabéns @AprendiNoLinux.



4. Re: Desafio: Ordenar números digitados [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 02/09/2011 - 11:28h

valew profs ;) @hudyfx qual o próximo passo, fora as pendencias que ainda não foram resolvidas ?




5. Re: Desafio: Ordenar números digitados [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 03/09/2011 - 09:45h

Olá @hudyfx , queria resolver a pendenga usando as funções já existentes.

Tentando a solução agora.


6. Re: Desafio: Ordenar números digitados [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 03/09/2011 - 10:05h

Nossa, ta levando o bash a outro nível, show! rsrsrs






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts