Algorítimo em Shell [RESOLVIDO]

1. Algorítimo em Shell [RESOLVIDO]

flavio
gutosoni

(usa KDE Neon)

Enviado em 17/04/2021 - 20:32h

Olá pessoal!

Estou tentando criar um algorítimo em shell do problema a seguir, mas não estou tendo êxito dentro do loop. Sei que precisa do bc, mas não sei como inseri-lo. Alguém saberia criar esse algorítimo?

Supondo que a população de um país A seja da ordem de 80000 habitantes com uma taxa anual de crescimento de 3% e que a população de B seja 200000 habitantes com uma taxa de crescimento de 1.5%. Faça um programa que calcule e escreva o número de anos necessários para que a população do país A ultrapasse ou iguale a população do país B, mantidas as taxas de crescimento.


#!/usr/bin/env bash

pop_a=80000
pop_b=200000
ano=0

while [ "$pop_a" -le "$pop_b" ]; do
pop_a+=pop_a*0.03
pop_b+=pop_b*0.015
ano+=1
done
echo "A ultrapassa B em $ano anos"


Eu criei um novo tópico, porque por engano marquei o anterior como resolvido.


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 17/04/2021 - 21:43h


gutosoni escreveu:


msoliver escreveu:

gutosoni escreveu:

Olá pessoal!

Estou tentando criar um algorítimo em shell do problema a seguir, mas não estou tendo êxito dentro do loop. Sei que precisa do bc, mas não sei como inseri-lo. Alguém saberia criar esse algorítimo?

Supondo que a população de um país A seja da ordem de 80000 habitantes com uma taxa anual de crescimento de 3% e que a população de B seja 200000 habitantes com uma taxa de crescimento de 1.5%. Faça um programa que calcule e escreva o número de anos necessários para que a população do país A ultrapasse ou iguale a população do país B, mantidas as taxas de crescimento.


#!/usr/bin/env bash

pop_a=80000
pop_b=200000
ano=0

while [ "$pop_a" -le "$pop_b" ]; do
pop_a+=pop_a*0.03
pop_b+=pop_b*0.015
ano+=1
done
echo "A ultrapassa B em $ano anos"


Eu criei um novo tópico, porque por engano marquei o anterior como resolvido.

Boa Noite Gutosoni.
Testei aqui e funcionou.... Teste, por favor.
#!/usr/bin/env bash

pais_A=80000;pais_B=200000;ano=0;stt=0;

while ((${stt} < 1)); do
pais_A=$(bc <<< "${pais_A} * 1.03");
pais_B=$(bc <<< "${pais_B} * 1.015");
let ano++;
stt=$(bc <<< "${pais_A}>=${pais_B}");
#Linha Abaixo é para testes#
printf "PAIS_A: %s =» PAIS_B: %s =» ANO: %02d =» STT: %d\n" ${pais_A} ${pais_B} ${ano} ${stt}
done
echo "PAIS_A:${pais_A} \">=\" PAIS_B:${pais_B} em $ano anos"

PAIS_A =» 515032.34 ">=" PAIS_B =» 510964.368 em =» 63 anos

______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________


Msoliver, funcionou perfeitamente.
Além disso é possível ver a população de A e B com o passar dos anos até ultrapassar.
Pelo o que entendi o stt controla o loop e encerra assim que a população de A iguala ou supera a população de B. Obrigado!

Justamente, quem controla o looping e a var stt
Originada pelo "bc", já que o bash só trabalha com numero inteiro
$(bc <<< "${pais_A}>=${pais_B}");
verdadeiro=1
falso=0
Depois que postei, fiz uma alteração no laço.
segue:
while :;do
pais_A=$(bc <<< "${pais_A} * 1.03");
pais_B=$(bc <<< "${pais_B} * 1.015");
let ano++;
stt=$(bc <<< "${pais_A}>=${pais_B}");
printf "PAIS_A: %s =» PAIS_B: %s =» ANO: %02d =» STT: %d\n" ${pais_A} ${pais_B} ${ano} ${stt}
((${stt} > 0)) && break
done
echo "PAIS_A =» ${pais_A} \">=\" PAIS_B =» ${pais_B} em =» $ano anos"


Agora que está funcionando, só falta MARCAR como RESOLVIDO e escolher a MELHOR RESPOSTA, KKKKKKK


______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________


3. Re: Algorítimo em Shell [RESOLVIDO]

Mauricio Ferrari
mauricio123

(usa Slackware)

Enviado em 17/04/2021 - 20:38h


tudo bem.

quando eu chegar em casa eu reviso

pelo celular eu nao pude testar.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento



4. Re: Algorítimo em Shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/04/2021 - 20:50h

Precisa ser Bash?
Se precisar ser Bash, melhor você usar o teste [[ ao invés de [ .
Mas eu fereço uma solução em Zshell para não precisar recorrer ao bc

#!/bin/zsh

pop_a=80000
pop_b=200000
ano=0

while ((pop_a<pop_b))
do
pop_a=$((pop_a*1.03))
pop_b=$((pop_b*1.015))
((++ano))
done
echo "A ultrapassa B em $ano anos"


Uma solução um tanto enrolada, porém compatível com zsh e bash:
#!/bin/bash

pop_a=80000
pop_b=200000

while ((pop_a<pop_b))
do
pop_a=$((pop_a * (1000+30)/1000))
pop_b=$((pop_b * (1000+15)/1000))
((++ano))
done
echo "A ultrapassa B em $ano anos"


Usando `(1000+30)/1000' ao invés de `1.03'...



5. Re: Algorítimo em Shell

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 17/04/2021 - 20:53h

gutosoni escreveu:

Olá pessoal!

Estou tentando criar um algorítimo em shell do problema a seguir, mas não estou tendo êxito dentro do loop. Sei que precisa do bc, mas não sei como inseri-lo. Alguém saberia criar esse algorítimo?

Supondo que a população de um país A seja da ordem de 80000 habitantes com uma taxa anual de crescimento de 3% e que a população de B seja 200000 habitantes com uma taxa de crescimento de 1.5%. Faça um programa que calcule e escreva o número de anos necessários para que a população do país A ultrapasse ou iguale a população do país B, mantidas as taxas de crescimento.


#!/usr/bin/env bash

pop_a=80000
pop_b=200000
ano=0

while [ "$pop_a" -le "$pop_b" ]; do
pop_a+=pop_a*0.03
pop_b+=pop_b*0.015
ano+=1
done
echo "A ultrapassa B em $ano anos"


Eu criei um novo tópico, porque por engano marquei o anterior como resolvido.

Boa Noite Gutosoni.
Testei aqui e funcionou.... Teste, por favor.
#!/usr/bin/env bash

pais_A=80000;pais_B=200000;ano=0;stt=0;

while ((${stt} < 1)); do
pais_A=$(bc <<< "${pais_A} * 1.03");
pais_B=$(bc <<< "${pais_B} * 1.015");
let ano++;
stt=$(bc <<< "${pais_A}>=${pais_B}");
#Linha Abaixo é para testes#
printf "PAIS_A: %s =» PAIS_B: %s =» ANO: %02d =» STT: %d\n" ${pais_A} ${pais_B} ${ano} ${stt}
done
echo "PAIS_A:${pais_A} \">=\" PAIS_B:${pais_B} em $ano anos"

PAIS_A =» 515032.34 ">=" PAIS_B =» 510964.368 em =» 63 anos

______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________



6. Re: Algorítimo em Shell [RESOLVIDO]

flavio
gutosoni

(usa KDE Neon)

Enviado em 17/04/2021 - 21:30h


msoliver escreveu:

gutosoni escreveu:

Olá pessoal!

Estou tentando criar um algorítimo em shell do problema a seguir, mas não estou tendo êxito dentro do loop. Sei que precisa do bc, mas não sei como inseri-lo. Alguém saberia criar esse algorítimo?

Supondo que a população de um país A seja da ordem de 80000 habitantes com uma taxa anual de crescimento de 3% e que a população de B seja 200000 habitantes com uma taxa de crescimento de 1.5%. Faça um programa que calcule e escreva o número de anos necessários para que a população do país A ultrapasse ou iguale a população do país B, mantidas as taxas de crescimento.


#!/usr/bin/env bash

pop_a=80000
pop_b=200000
ano=0

while [ "$pop_a" -le "$pop_b" ]; do
pop_a+=pop_a*0.03
pop_b+=pop_b*0.015
ano+=1
done
echo "A ultrapassa B em $ano anos"


Eu criei um novo tópico, porque por engano marquei o anterior como resolvido.

Boa Noite Gutosoni.
Testei aqui e funcionou.... Teste, por favor.
#!/usr/bin/env bash

pais_A=80000;pais_B=200000;ano=0;stt=0;

while ((${stt} < 1)); do
pais_A=$(bc <<< "${pais_A} * 1.03");
pais_B=$(bc <<< "${pais_B} * 1.015");
let ano++;
stt=$(bc <<< "${pais_A}>=${pais_B}");
#Linha Abaixo é para testes#
printf "PAIS_A: %s =» PAIS_B: %s =» ANO: %02d =» STT: %d\n" ${pais_A} ${pais_B} ${ano} ${stt}
done
echo "PAIS_A:${pais_A} \">=\" PAIS_B:${pais_B} em $ano anos"

PAIS_A =» 515032.34 ">=" PAIS_B =» 510964.368 em =» 63 anos

______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________


Msoliver, funcionou perfeitamente. Além disso é possível ver a população de A e B com o passar dos anos até ultrapassar. Pelo o que entendi o stt controla o loop e encerra assim que a população de A iguala ou supera a população de B. Obrigado!


7. Re: Algorítimo em Shell [RESOLVIDO]

Mauricio Ferrari
mauricio123

(usa Slackware)

Enviado em 17/04/2021 - 21:39h


Demorou, mas cheguei. Vou até guardar como aprendizado.


#!/bin/bash

pop_a=80000
pop_b=200000
ano=0

while (($(bc <<< "$pop_a>=$pop_b") < 1)); do
pop_a=$( bc <<< "$pop_a * 1.03" )
pop_b=$( bc <<< "$pop_b * 1.015" )
let ano++
done
echo "A ultrapassa B em $ano anos"


Ficou parecido com o do nosso amigo acima. É a melhor forma de se resolver.
___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento



8. Re: Algorítimo em Shell [RESOLVIDO]

Mauricio Ferrari
mauricio123

(usa Slackware)

Enviado em 17/04/2021 - 21:46h


Você pode simplificar a solução do nosso amigo gutosoni como eu fiz no meu. Afinal, não fez muita diferença.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento



9. Re: Algorítimo em Shell [RESOLVIDO]

flavio
gutosoni

(usa KDE Neon)

Enviado em 17/04/2021 - 21:47h


fenixdragao escreveu:

Precisa ser Bash?
Se precisar ser Bash, melhor você usar o teste [[ ao invés de [ .
Mas eu fereço uma solução em Zshell para não precisar recorrer ao bc

#!/bin/zsh

pop_a=80000
pop_b=200000
ano=0

while ((pop_a<pop_b))
do
pop_a=$((pop_a*1.03))
pop_b=$((pop_b*1.015))
((++ano))
done
echo "A ultrapassa B em $ano anos"


Uma solução um tanto enrolada, porém compatível com zsh e bash:
#!/bin/bash

pop_a=80000
pop_b=200000

while ((pop_a<pop_b))
do
pop_a=$((pop_a * (1000+30)/1000))
pop_b=$((pop_b * (1000+15)/1000))
((++ano))
done
echo "A ultrapassa B em $ano anos"


Usando `(1000+30)/1000' ao invés de `1.03'...


Olá fenixdragão.
Realmente, o código em zsh trabalha com float, enquanto o bash não. O segundo código até que é uma boa alternativa ao bc. Seus códigos são simples e funcionais. Obrigado!


10. Re: Algorítimo em Shell [RESOLVIDO]

Mauricio Ferrari
mauricio123

(usa Slackware)

Enviado em 17/04/2021 - 21:48h


(($(bc <<< "${pais_A}>=${pais_B}") > 0)) && break


___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento



11. Re: Algorítimo em Shell [RESOLVIDO]

flavio
gutosoni

(usa KDE Neon)

Enviado em 17/04/2021 - 21:50h


mauricio123 escreveu:


Demorou, mas cheguei. Vou até guardar como aprendizado.


#!/bin/bash

pop_a=80000
pop_b=200000
ano=0

while (($(bc <<< "$pop_a>=$pop_b") < 1)); do
pop_a=$( bc <<< "$pop_a * 1.03" )
pop_b=$( bc <<< "$pop_b * 1.015" )
let ano++
done
echo "A ultrapassa B em $ano anos"


Ficou parecido com o do nosso amigo acima. É a melhor forma de se resolver.
___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento


Isso mesmo. Valeu Maurício!


12. Re: Algorítimo em Shell [RESOLVIDO]

Mauricio Ferrari
mauricio123

(usa Slackware)

Enviado em 17/04/2021 - 22:00h


Sei que já marcou a melhor resposta e foi justa.

Mas só para se ter uma ideia do poder do shell:

#!/bin/bash

pop_a=80000; pop_b=200000; ano=0

while :; do
pop_a=`bc <<< "$pop_a * 1.03"`
pop_b=`bc <<< "$pop_b * 1.015"`
let ano++
((`bc <<< "$pop_a>=$pop_b"` > 0)) && break
done; echo "A ultrapassa B em $ano anos"


É possível sem os $( ).

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento




01 02