Ajuda com código(Shell Script)

Iniciado por Blink182br, 04 de Abril de 2008, 21:19

tópico anterior - próximo tópico

Blink182br

eis o código
Citar#!/bin/bash
#-------------------------------------
# Autor : Nícholas André
# Programa: Sei lá
#
#
#-------------------------------------
#Área de Funções
#-------------------------------------




#----------
function par
{
   
   NUM=$((NUM/2))
   echo $NUM
   NUM2=$((NUM%2))
   if [ $NUM2 != 0 ]
   then
   {
      echo $NUM
      impar
   }
   else
   par
   fi
}
function impar
{
   
   NUM=$((((3*NUM) + 1)/2))
   echo $NUM
   NUM5=$((NUM%2))
   if [ $NUM5 = 0 ]
   then
   {
      par
   }
   else
   {
      impar
   }
   fi
}
#-------------------------------------
#Fim de Área de Funções
#-------------------------------------
#Corpo do Programa
#-------------------------------------
echo "Digite um número"
read NUM


#NUM2 para testar se é impar ou par

NUM2=$((NUM%2))
if [ $NUM2 = 0 ]
then
{
   while (true)
   do
   par
   if [ $NUM =  0 || $NUM = 1 || $NUM = 2 ]
   then
   break
   fi
   done
}
else
{
   while (true)
   do
   impar
   if [ $NUM = 0  || $NUM = 1 || $NUM = 2]
   then
   break
   fi
   done
}
fi
#-------------------------------------
#Fim do Corpo do Programa

O programa:
Criar um programa que receba um numero do usuário e se ele for par dividar ele por 2 sucessivamente até chegar a 1, se ele for impar aplicar a forma 3x + 1 /2 onde x é o valor inserio pelo usuário. E se numa divisão ou na aplicação da segunda fórmula o numero der impar ou par, chama a função impar ou par.

EX: usuário digita 10
10/2 = 5
5 é impar
(3.5 + 1 )/2 = 8
8/2 = 4
4 é par
4 / 2 = 2
2/2 = 1
fim.. e o programa precisa exibir todos os resultados das divisões.
Ex2: Usuário digita 11
11 é ímpar
(3.11 + 1 )/ 2 = 17
17 é impar
(3.17 + 1)/2 = 26
26/2 = 13
(3.13 + 1)/2 = 20
20/2 = 10
10/2 = 5
(3.5 + 1) / 2 = 8
8/2 = 4
4/2 = 2
2/2 = 1
4/2 = 2
2/2 = 1

Grato pela ajuda

clcampos

#1
Seus exemplos não estão errados? Tá duro de entender.

Veja no exemplo 1 que a equação 3.5 + 1 /2 = 8 só pode ser verdadeira se a fórmula for (3 x 5 + 1) /2 = 8

Mas no exemplo 2 a mesma fórmula tá de outro jeito, porque para a fórmula 3.11 + 1 / 2 = 16 não pode dar 16, veja:

(3 x 11 + 1) / 2 = 16
(33 + 1) / 2 = 16
34/2 = 16
17 <> 16

E ai?

Poderia explicar melhor? De qualquer forma vou brincar e colocar algo até sua resposta.

E o que exatamente você quer? Apresentar um código? Acertar algum erro? Se é isso onde esta o erro?

Estou fazendo do zero já que só tenho dúvidas.
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

clcampos

#2
Bem, mesmo cheio de dúvidas tá ai minha versão:

Para funcionar a rotina deve ter obrigatoriamente o nome de mostraNum.sh.

Citação de: Rotina do tópico Ajuda com código (Shell Script)#!/bin/bash
#
# Cristiano
# 04/abr/2008
#

Num=${1:-"0"}    # Se recebe o número por linha ok, senão faz igual a zero

expr $Num + 1 > /dev/null 2> /dev/null

[[ $? -ne 0 ]] && echo "Parametro informado não é número" && exit

if test $Num = 0; then
   while true;do
         echo -e "\n\nDigite um valor: \c"
         read Num

         expr $Num + 1 > /dev/null 2> /dev/null
         [[ $? -ne 0  ]] && echo -e "Informe um número maior que zero ou \033[1mFim\033[0m para encerrar" && continue

         break
   done
fi

if test $((Num % 2)) -eq 0; then
   Num=$((Num / 2))
else
   Num=$((((Num * 3) + 1)/2))
fi

echo $Num

if test $Num -le 1;then
   echo -e "\n\nFim da rotina.\n\n"
else
   sh mostraNum.sh $Num
fi
Cristiano/Timóteo - MG
.: Como Fazer Perguntas de Forma Inteligente :.                
Com dúvida? pesquise!

Blink182br

#3
Citação de: clcampos online 04 de Abril de 2008, 22:49
Seus exemplos não estão errados? Tá duro de entender.

Veja no exemplo 1 que a equação 3.5 + 1 /2 = 8 só pode ser verdadeira se a fórmula for (3 x 5 + 1) /2 = 8

Mas no exemplo 2 a mesma fórmula tá de outro jeito, porque para a fórmula 3.11 + 1 / 2 = 16 não pode dar 16, veja:

(3 x 11 + 1) / 2 = 16
(33 + 1) / 2 = 16
34/2 = 16
17 <> 16

E ai?

Poderia explicar melhor? De qualquer forma vou brincar e colocar algo até sua resposta.

E o que exatamente você quer? Apresentar um código? Acertar algum erro? Se é isso onde esta o erro?

Estou fazendo do zero já que só tenho dúvidas.

ahhh erro meu... mal ae, eh que fiz os exemplos muitos rápidos.. hehehe concertei..

O meu Código até então. Não estava funcionando direito. se vc copiar ele e executar verá que qualquer numero digitado ele vai fazer um loop sem fim e ficará aparecendo na tela 1 e 2 infinitamente. A função do programa é mostrar todos os numeros resultados da divisão e da aplicação da formula.
EX:
10/2 = 5
(3.5 + 1) /2 = 8
8/2 = 4
4/2 = 2
2/2 = 1

O que tah destacado é para aparecer na tela

Blink182br

Ahh Consegui. :P
Brigado pela ajuda.
Achei o erro no meu código..
lá vai ele.
Citar#!/bin/bash
#-------------------------------------
# Autor : Nícholas André
# Programa: Sei lá
#
#
#-------------------------------------
#Área de Funções
#-------------------------------------




#----------
function par
{
   if [ $NUM = 1 ]
   then
   exit 0
   fi
   NUM=$((NUM/2))
   echo $NUM
 
   if test $(($NUM % 2)) -eq 0
   then
   {
         par
       
       
   }
   else
        #echo $NUM
        impar
   fi
}
function impar
{
   if [ $NUM = 1 ]
   then
   exit 0
   fi
   NUM=$((((3*NUM) + 1)/2))
   echo $NUM
   if test $(($NUM % 2)) -eq 0
   then
   {
      par
   }
   else
   {
      impar
   }
   fi
}
#-------------------------------------
#Fim de Área de Funções
#-------------------------------------
#Corpo do Programa
#-------------------------------------
echo "Digite um número"
read NUM

#NUM2 para testar se é impar ou par


if test $(($NUM % 2)) -eq 0
then
{
   
 
   while (true)
   do
   par
   done
}
else
{

   while (true)
   do
   impar
   done
}
fi
#-------------------------------------
#Fim do Corpo do Programa