Dúvida no script.. Como efetuar soma de números consecultivos? [RESOLVIDO]

1. Dúvida no script.. Como efetuar soma de números consecultivos? [RESOLVIDO]

Filipe Gomes de Lima
filipegl

(usa Ubuntu)

Enviado em 20/02/2016 - 20:13h

Olá pessoal, sou iniciante no linux e estou aprendendo shell script.
Meu objetivo nesse script era de fazer a soma de determinado intervalo de números.
Exemplo, o usuário digita os números 10 e 50 como parametros... daí o script vai fazer a soma de 10 + 11 + 12 + ... + 50 e imprimir o resultado.
Eu fiz um loop com o 'for' pra gerar os números:

for num in {$1..$2} do  


Mas não consigo pensar em um jeito de soma-los.
Alguem poderia me dar essa luz? kkk
Obrigado!


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/02/2016 - 10:07h

filipee6 escreveu:

for num in {$1..$2} do  


Para fazer a soma, você só tem de fazer isto:

((soma=0))
for num in {$1..$2}; do ((soma+=num)); done



ENTRETANTO:

A construção “{a..b}” coloca todas as parcelas como texto em memória RAM. Então, se o usuário pedir para somar os valores entre um e cem milhões, por exemplo, você vai alocar uma absurdidade de memória, com grandes chances de provocar um severo thrashing e, na prática, congelar a máquina.

Uma alternativa é fazer um loop que não expanda previamente todos os possíveis valores. Por exemplo:

((soma=0))
for ((num=$1; num<=$2; num++)); do ((soma+=num)); done


Com isso, o consumo de memória fica baixo (suficiente para acomodar apenas as variáveis soma e num), e a máquina não vai congelar.

O problema é que essa operação é lenta, e isso fica especialmente evidente quando o número de parcelas aumenta (na minha máquina, um Core i5 de 3.2GHz, levou 7min52s para somar de um a cem milhões). E lenta é também a sugestão dada de gerar uma tripa de texto com seq e passá-la para bc efetuar a conta.

Muito melhor é você usar o mínimo de conhecimento matemático, e usar a forma reduzida de somar os termos de uma progressão aritmética, soma(a(n)..a(m)):=(a(n)+a(m))*(m+1-n)/2.

No seu caso particular, a(k)=k, de modo que sua soma se calcula com a seguinte simples expressão.

((soma=($1+$2)*($2+1-$1)/2)) 


Caso o shell não tenha precisão suficiente para representar alguma das parcelas ou a soma final, você pode usar o bc.

soma=`echo "($1+$2)*($2+1-$1)/2" | bc` 


3. Re: Dúvida no script.. Como efetuar soma de números consecultivos? [RESOLVIDO]

Wagner Souza
wagnerfs

(usa Fedora)

Enviado em 22/02/2016 - 08:51h

Seguem alguns exemplos para te ajuda:

#!/bin/bash


echo $(seq $1 $2 | tr '\n' +) 0 | bc


Para executar o script é só dar permissão ao mesmo:

$ chmod +x script.sh

$ ./script.sh num1 num2


No próprio terminal você pode executar:

echo {10..50} | tr ' ' + | bc 

_________________________
Wagner F. de Souza
Técnico/Instrutor de Informática
"GNU/Linux for human beings."
LPI ID: LPI000297782


4. Re: Dúvida no script.. Como efetuar soma de números consecultivos?

Filipe Gomes de Lima
filipegl

(usa Ubuntu)

Enviado em 22/02/2016 - 11:51h

paulo1205


Paulo, valeu pela resposta... foi perfeita e me ajudou bastante
Testei aqui em casa e deu certo! (A solução da PA tambem foi muito boa kkk não tinha pensado nisso)
Mas não entendi o porque de ter dado certo. Porque quando eu digito
soma+=$num 
ele vai somar? qual o significado desse += ?
Eu sei que 'soma' é uma variável e que $num vai obter n valores dependendo de quantos loops o 'for' mandar, enfim.
Desculpa a pergunta e minha leiguice rsrs, mas só consigo entender quando eu sei o real significado das coisas kkk.
Obrigado



5. Re: Dúvida no script.. Como efetuar soma de números consecultivos? [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 22/02/2016 - 13:40h

filipee6 escreveu:

Olá pessoal, sou iniciante no linux e estou aprendendo shell script.
Meu objetivo nesse script era de fazer a soma de determinado intervalo de números.
Exemplo, o usuário digita os números 10 e 50 como parametros... daí o script vai fazer a soma de 10 + 11 + 12 + ... + 50 e imprimir o resultado.
Eu fiz um loop com o 'for' pra gerar os números:

for num in {$1..$2} do  


Mas não consigo pensar em um jeito de soma-los.
Alguem poderia me dar essa luz? kkk
Obrigado!


###################################
Você pode SOMAR com o awk, do seguinte modo:
awk '{T1=$1+$2;T2=$2+1-$1;TT=T1*T2/2;printf "SOMA = %s\n" ,TT}' <<< "1 100" 

SOMA = 5050 


Att.:
Marcelo









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts