Duvida For + Array

1. Duvida For + Array

Evandro da Cruz Hila
evandrohila

(usa Debian)

Enviado em 18/11/2015 - 14:17h

Pessoal,

Estou tentando criar um script que lê uma determinada quantidade de valores, grava em um array e depois verifica qual é o maior e o menor valor, porém não estou conseguindo.

Se eu escolher a quantidade de 3 valores, ele mostra o maior valor certinho, porém o menor ele mostra o segundo valor digitado. Exemplo.

Escolha a quantidade de valores que deseja digitar (aqui digite apenas numeros): 3
valor 1: 12
valor 2: 13
valor 3: 14

O retorno fica:
Maior: 14
Menor: 13



#!/bin/bash

clear

read -p "Escolha a quantidade de valores que deseja digitar (aqui digite apenas numeros): " qtde

for ((i=1; i <= $qtde; i++)) do
read -p "valor $i: " array[$i]='valor'
done

clear


#Verifica qual o numero maior
for (( i=1; i <= $qtde; i++ )) do
for (( j = $i; j <= $qtde; j++ )) do
if [ ${array[$i]} -gt ${array[$j]} ]; then
maior=${array[$i]}
else
maior=${array[$j]}
fi
done
done

echo "Maior: $maior"

#Verifica o menor

for (( i=1; i < $qtde; i++ )) do
for (( j = $i; j <= $qtde; j++ )) do
if [ ${array[$i]} -lt ${array[$j]} ]; then
menor=${array[$i]}
else
menor=${array[$j]}
fi
done
done

echo "Menor: $menor"


  


2. Re: Duvida For + Array

Paulo
paulo1205

(usa Ubuntu)

Enviado em 18/11/2015 - 18:40h

Seu algoritmo de procura está desnecessariamente complexo -- e eu nem vi se está funcionalmente certo, apesar da ineficiência. Você não precisa de loop dentro de loop.

Assuma, inicialmente que o maior e o menor elementos são o primeiro elemento. Em seguida, comece a repetição pelo segundo elemento, testando se o maior até agora é menor do que o elemento sendo testado, e faça os devidos ajustes. Raciocínio análogo serve para buscar o menor elemento.


3. Re: Duvida For + Array

Evandro da Cruz Hila
evandrohila

(usa Debian)

Enviado em 18/11/2015 - 20:19h

Consegui com outro raciocinio.

Ordenei os valores em ordem crescente e exibi o primeiro e o último.

#!/bin/bash

clear

read -p "Escolha a quantidade de valores que deseja digitar (aqui digite apenas numeros): " qtde

for ((i=1; i <= $qtde; i++)) do
read -p "valor $i: " array[$i]='valor'
done

clear

#Coloca os valores em ordem crescente

for ((i=1; i<= $qtde; i++)) do
for (( j = $i; j <= $qtde; j++ )) do
if [ ${array[$i]} -gt ${array[$j]} ]; then
t=${array[$i]}
array[$i]=${array[$j]}
array[$j]=$t
fi
done
done

echo "Menor: ${array[1]}"
echo "Maior: ${array[$qtde]}"


4. Re: Duvida For + Array

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/11/2015 - 15:34h

Fico feliz que você tenha resolvido seu problema. Mas permita-me fazer alguns comentários.

1) Quando tiver de fazer um exercício, faça o que a questão pede, sem complicar nem inventar. Ao transformar um problema de simples seleção de dois valores num problema de ordenação, você elevou um problema de complexidade linear (i.e. proporcional ao número de elementos) a um grau de complexidade muito maior -- no seu caso, quadrática (i.e. proporcional ao quadrado do número de elementos). Assim, se você dobrar o número de elementos, o tempo de execução vai crescer quatro vezes. Se multiplicar por dez, o tempo vai aumentar cem vezes.

2) Ainda que você precisasse de ordenação, você escolheu um dos piores algoritmos possíveis de ordenação, pior até do que o famoso (e famigerado) bubble sort.

3) Na hora que você invoca o comando read, aquela atribuição de “'valor'” à variável array[$i] é redundante.

4) Num caso geral, o primeiro elemento de arrays indexados tem índice 0, não 1.

5) A não ser que tenha sido explicitamente pedido, você nem precisa de arrays para implementar seu programa. Veja abaixo.

#!/bin/bash
read -p "Digite a quantidade de valores: " n
if (( n>=1 )); then
read -p "Digite o 1º valor: " maior
menor=$maior
for (( i=2; i<=n; i++ )); do
read -p "Digite o ${i}º valor: " v
(( v<menor )) && menor=$v
(( v>maior )) && maior=$v
done
echo "O maior valor digitado foi $maior."
echo "O menor valor digitado foi $menor."
fi



5. Re: Duvida For + Array

Evandro da Cruz Hila
evandrohila

(usa Debian)

Enviado em 19/11/2015 - 15:57h


Sem dúvidas,

minha pergunta até pareceu estranha depois de ver o quão simples era a questão.

Muito obrigado pelas dicas.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts