O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[Ruby] Aula 4 - Condições e Estruturas de Controle

Iniciado por Raizen, 12/03/2013 às 15:00

12/03/2013 às 15:00 Última edição: 16/12/2015 às 10:30 por Raizen
[box class=windowbg1]
Índice das aulas básicas
  • Aula 1 - Introdução
  • Aula 2 - Objetos
  • Aula 3 - Operações
  • Aula 4 - Condições
  • Aula 5 - Repetição
  • Aula 6 - Arrays
  • Aula 7 - Hashes
    [/box]
    [box class=windowbg1]
    Índice das aulas avançadas
  • Aula 8 - Superclasses e instâncias
    [/box]
    [box class=windowbg1]
    Índice das aulas de algoritmos
  • Aula 1 - Sort
  • Aula 2 - Busca
  • Aula 3 - Recursividade
    [/box]

    [box class=windowbg2]
    Estruturas Condicionais
    [/box]

    [box class=catbg2]
    Introdução
    [/box]
    [box class=information]
       Agora a coisa começa a ficar interessante, partimos para as estruturas condicionais!  :wow:, agora chega em um ponto aonde programar fica interessante, podendo criar especificações para o seu código, ou seja, começa a aprender a como manusear ele. Se ainda não viu as aulas anteriores, veja agora antes de se aprofundar nesse novo conhecimento.

       Começamos pela comparação, se tem uma condição, você tem que comparar algo, logo.
    == # se for igual
    != # diferente de
    > #maior que
    >= #maior ou igual a que
    < #menor que
    <= #menor ou igual que
    


      As vezes é necessário comparar mais que uma coisa, ai vem a conjunção .
    and / && # E, se tudo atinge seu objetivo.
    or / || #ou se uma das coisas atinge o objetivo.
    

    Claro aqui é só teoria, vamos colocar na prática que vocês pegam rapidinho!  :wow:[/box]

    [box class=catbg2]
    SE
    [/box]
    [box class=information]
    A condição mais conhecida em qualquer linguagem de programação que existe, SE, em que o programa segue com o seguinte raciocínio.
    SE alguma condição ENTAO algo acontece FIM DO SE.
    todas seguem esse mesmo raciocínio, logo no Ruby pode ser escrito desse modo.
    if (algo atinge seu objetivo) then (algo acontece) end
    

    Porém nas versões recentes do Ruby, que já inclui todos os rpg makers, é comum pular linhas para indicar um próximo comando, substituindo o then, e mantendo o end em outra linha, para melhor visualização, exemplo.
    if (algo atinge seu objetivo)
      (algo acontece)
    end # fim da condição
    

    E claro, pode ter uma exceção se o código não for impresso, por exemplo.
    if (algo atinge seu objetivo)
      (algo acontece)
    else # caso algo não atinja seu objetivo
      (algo diferente acontece)
    end #fim da condição.
    


    Na prática.
    a = 2
    if a == 2 #atinge condição
      p "funcionou :D"
    else
      p "não funcionou T-T"
    end
    

    Agora vamos juntar a comparação e a conjunção!
    a = 4
    if a >= 0 and a <= 5
      p "a está entre 0 e 5"
    else
      p "a não está entre 0 e 5"
    end
    

    Agora pegue o código acima, cole no seu RPG Maker e brinque um pouco com comparações e conjunções para ver se realmente pegou o jeito.[/box]

    [box class=catbg2]
    Se Não Se
    [/box]
    [box class=information]
    Agora mais uma parte interessante, e se eu quiser colocar condições nas exceções?
    Bom o mais lógico seria fazer o seguinte.
    a = 2
    if a < 1
      p "a é menor que 1"
    else
      if a == 1
        p "a é igual a 1"
      else
        p "a não é igual nem menor que 1"
      end
    end
    

    Começa a ficar confuso não? Por isso no Ruby tem a reservada elsif, que faz exatamente a mesma coisa, e ainda poupa espaço e tempo, o código acima com elsif.
    a = 2
    if a < 1
      p "a é menor que 1"
    elsif a == 1
      p "a é igual a 1"
    else
      p "a não é igual nem menor que 1"
    end
    
    [/box]

    [box class=catbg2]
    A menos que
    [/box]
    [box class=information]
    A menos que, seria exatamente o contrário do se, e é usado o unless, isso seria o tal chamado, boas maneiras de programação, você em boa parte da vida como programador, irá usar o unless para substituir o se não, ou seja.
    if not a
    end
    

    seria substituido por
    unless a
    End
    

    [/box]

    [box class=catbg2]
    Caso
    [/box]
    [box class=information]Aprenderam bem o se(if), o se não(else) e o se não se(elsif)? Pois bem agora vem algo que junta boa parte disso, que é o case.
    O case nada mais é que uma sequência de condições, em que se busca atingir 1 dos casos, porém diferente de uma condição, o case é muito usado para buscar condições de valor único, facilitando no entendimento do programa, e na hora de programar, exemplo:.
    a = 2
    case a
      when 1
        p "a é 1"
      when 2
        p "a é 2"
      when 3
        p "a é 3"
    end
    

    Modifique o valor de a, e crie novas condições para ver o resultado  :clap: .
    [/box]

    [box class=catbg2]
    Avançando
    [/box]
    [box class=information] Leia essa parte apenas se está afiado nas condições anteriores, caso contrário pule para os exercícios e só depois volte para cá!

    Certo, pegaram bem as condições? pois as estruturas de controle, como comumente são chamados pelos programadores, serve para limitar o programa, e direciona-lo a fazer o que bem entende a você, aliando isso a aula 5, que é sobre estruturas de repetição, você ganha um aliado fortíssimo para programar, e se estão lendo essa parte aqui, é porque pegaram bem a ideia, então vou mostrar a última condição.

    If/else, quando se trata de uma condição simples, ela pode ser substituída por simbologia, por exemplo.
    if algo == 2 then (algo1) else (algo2) end
    

    Esse código acima pode ser substituído por.
    algo == 2 ? (algo1) : (algo2)
    

    O que significa um código bem mais limpo e agradável.
    [/box]


    [box class=catbg2]
    Exercícios & Conclusão
    [/box]
    [box class=information]Fáceis:
  • Crie uma Constante, que indica o número de laranjas, esse número é colocado pelo usuário, e se tiver um número exato a 12, imprima "uma dúzia.

  • crie uma condição aonde eu imprima a hora, que é colocado pelo usuário, exemplo...
    hora = 15
    if...
    

    e que imprima se a hora é impar, ou ela é par.

    Intermediário:
  • Optimize o código a seguir com o que foi aprendido nessa aula.
    red = 5
    if red == 1 then
      p "red eh 1"
    else 
      if red == 2 then
        p "red eh 2"
      else
        if red == 3 then
          p "red eh 3"
        else
          p "red nao é nenhum dos anteriores"
        end
      end
    end
    


  • Crie um método de somar, em que os argumentos sejam 2 números, porém que imprima se a soma é acima de 10, ou abaixo de 10.

    Avançado:
  • Faça um método aonde tenha 1 argumento, e indique se o número é divisível por 3, 4 ou 5. (lembrando que se for mais do que 1 deles, o método tem que indicar todos).

  • Faça uma classe qualquer criada por vocês, tenha 3 métodos, 1 método que recebe 2 valores quaisquer x e y, e que se a divisão de ambos der um número inteiro, chame o método 2, aonde é feito a divisão do maior pelo menor e retorna um Integer, e caso a divisão dos 2 dê um número quebrado(Float), ele chame o método 3, aonde retorne a divisão do maior pelo menor. (Esse é interessante  :rei: )

    Coloquem aqui no tópico caso façam algum dos exercícios para eu verificar, lembrando que não precisa fazer os 6, visto que os últimos são bem mais complicados. E boa sorte nos estudos :)
    [/box]

13/03/2013 às 10:16 #1 Última edição: 13/03/2013 às 10:18 por Dax
 Bem legal as suas aulas, bom você está de parabéns pois as aulas estão bem explicadas e tão... Aí fiz o dever de casa... Optei pelo avançado.;
red = 3
[1, 2, 3].each { |i| if red == i then p "red é #{i}" else p "red não é #{i}" end }



Muito boa a aula Raizen, como sempre! ^^.

Duas coisas:

== # se for igual
!= # diferente de
> #maior que
>= #maior ou igual a que
< #menor que
< #menor ou igual que

Exercícios & Comclusão

Dois pequenos erros de digitação xD.

Não fiz os exercícios, até porque eu já conhecia tudo o que havia escrito xD, mas eu li o tópico para ver se não encontrava algo novo em folha :B

Parabéns!

Citação de: Dax online 13/03/2013 às 10:16
Bem legal as suas aulas, bom você está de parabéns pois as aulas estão bem explicadas e tão... Aí fiz o dever de casa... Optei pelo avançado.;
red = 3
[1, 2, 3].each { |i| if red == i then p "red é #{i}" else p "red não é #{i}" end }

Vish, mas ai é avançado demais k x], mas gostei do medo que você fez :D, essas aulas são básicas, então é só para quem está começando mesmo :P, tipo você qé é bolado nisso já kk, tira isso de letra u_u.

@cristianoforce: oooops xD, vlws manin já arrumei :D.

Agora corrija meu código, sei que têm algo errado, acho.
class Felipef
   def laranjas
     laranjas = 12
 if laranjas == 12
   p "Possui uma dúzia de laranjas"
 else 
   p "Não tem uma dúzia"
   end
 end
 def horas
   horas = 24
   if horas == 1
     p "ímpar"
   elsif horas == 3
     p "ímpar"
   elsif horas == 5
     p "ímpar"
   elsif horas == 9
     p "ímpar"
   elsif horas == 11
     p "ímpar"
   elsif horas == 13
     p "ímpar"
   elsif horas == 15
     p "ímpar"
   elsif horas == 17
     p "ímpar"
   elsif horas == 19
     p "ímpar"
   elsif horas == 21
     p "ímpar"
   elsif horas == 23
     p "ímpar"
   else
     p "par"
     end
   end
     end
   conta = Felipef.new
   conta.laranjas
   conta.horas


Tem como você me explicar, se tiver como, deixar esta condição que eu fiz das horas, tipo bem simplificada XD?(Acho que escrevi mt)
  

09/04/2013 às 00:00 #5 Última edição: 09/04/2013 às 00:02 por Raizen
Sim sim k ^^, na verdade era algo assim apenas que eu esperava xD.

class Felipef
   def laranjas
     laranja = 12
 if laranja == 12
   p "Possui uma dúzia de laranjas"
 else 
   p "Não tem uma dúzia"
   end
 end
 def horas
   hora = 24
   if hora % 2 == 1
     p "ímpar"
   else
     p "par"
     end
   end
     end
   conta = Felipef.new
   conta.laranjas
   conta.horas


Lembrando 2 coisas, não use nome de variáveis iguais a nome de métodos :X.

Você havia colocado laranjas e laranjas, e horas e horas, isso não é muito legal xD, na verdade da StackError se você testar, provavelmente... porque ele tenta chamar o método dentro dele mesmo, então só deixar uma variável com nome diferente do método =D.

E, a ideia do impar e par, era usar esse simbolo %, que é resto logo... 5 % 2 == 1
4 % 2 == 0

O resto de 5 por 2, é 1.
O resto de 4 por 2, é 0.
=D

Citação de: Raizen online 09/04/2013 às 00:00
Sim sim k ^^, na verdade era algo assim apenas que eu esperava xD.

class Felipef
   def laranjas
     laranja = 12
 if laranja == 12
   p "Possui uma dúzia de laranjas"
 else 
   p "Não tem uma dúzia"
   end
 end
 def horas
   hora = 24
   if hora % 2 == 1
     p "ímpar"
   else
     p "par"
     end
   end
     end
   conta = Felipef.new
   conta.laranjas
   conta.horas


Lembrando 2 coisas, não use nome de variáveis iguais a nome de métodos :X.

Você havia colocado laranjas e laranjas, e horas e horas, isso não é muito legal xD, na verdade da StackError se você testar, provavelmente... porque ele tenta chamar o método dentro dele mesmo, então só deixar uma variável com nome diferente do método =D.

E, a ideia do impar e par, era usar esse simbolo %, que é resto logo... 5 % 2 == 1
4 % 2 == 0

O resto de 5 por 2, é 1.
O resto de 4 por 2, é 0.
=D
Obrigadopor corrigir, não sabia deste troço aí dos métodos e váriaveis não vlw XD
Vai ver porque nunca precisei usar.^^
  

Na verdade, sendo bem chato kk, mas se ler acho que entenderá bem, isso funciona para qualquer coisa.
Imagina o seguinte, eu tenho uma caixa.

Essa caixa eu coloco o nome de box, sempre que no programa eu buscar o box, ele vai pegar essa caixa e abrir, abrindo a caixa é que vemos se é uma variável, método, tanto que se eu buscar box2, e eu não criei essa box2, ele vai falar objeto não encontrado, ou seja não existe. Então criando com o nome laranja o método, só haverá uma caixa com nome laranja, se houver por exemplo uma classe com nome Laranja, não pode haver uma constante com nome Laranja. Isso porque Laranja já está sendo ocupado por outra coisa, ele pega um espaço no programa :P, então serve para qualquer coisa, não "nomeie" 2 coisas diferentes com mesmo nome, isso em qualquer linguagem ^^.

Aeee, to aprendendo hehe
Fiz a lição 1:
Spoiler

=begin
###############################################################################
                              TESTE [Horas/Maçãs]
###############################################################################
=end

class Ryan_bag
  def apples
    all_apples = 12
    if all_apples == 12
      p "Você tem 12 maçãs!"
    else all_apples < 12
      p "Você não tem 12 maçãs!"
    end
  end
  def clock
    hours = 19
    if hours % 2 == 1
      p "Impar"
    else
      p "Par"
    end
  end
end
  
resultado = Ryan_bag.new
resultado.apples
resultado.clock

[close]
E Lição 2:  :clap:
Spoiler
=begin
###############################################################################
                              TESTE 2 [Soma/Poções]
###############################################################################
=end
class Ryan_potions
  def potions (x, y)
    all_potions = x + y
    if all_potions >= 10
      p "Você tem 10 poções"
    else all_potions < 10
      p "Você não tem 10 poções"
    end
  end
end

resultado = Ryan_potions.new
resultado.potions(5,5)

[close]

A 3º não entendi muito bem kkkk, já quebrei a cabeça pra fazer a 2 kkkk

Perfeito  :wow:, depois tente os outros, a 3 na verdade, é só escrever aquele código de um jeito mais curto do que está xD.

Ah e na um eu havia pedido constante que seria...

Constante, aquele valor que não muda, de resto parabéns, e fico feliz que esteja acompanhando :D, a aula 5 deve sair lá na próxima semana provavelmente.

Ok, ops sorry kkkk, mas entendi como funfa, isso é o mais importante kk agradeço a você pelas aulas, eu sempre quis aprender scripts :3
Nossa, eu to caçando a 5º aula aqui e to "Cadê? Só tem 6º" kkkkk, aguardo então, enquanto isso leio as outras. obrigado :3

O exercício fácil, mas acho que não é assim a verificação se é impar ou par. :rei:
class Netinho
  laranjas = 12
  hora = 12
  if laranjas == 12
    p "uma dúzia"
  else
    p "não tem 12"
  end
  if hora = 
  if horas = 0 or 2 or 4 or 6 or 8 or 10 or 12 or 13 or 14 or 15 or 16 or 18 or 20 or 22 or 24
    p "par"
  else
    p "impar"
  end
  
end



Esse intermediário foi um pouco fácil também, só não entendi direito o segundo ponto pedido.
"Crie um método de somar, em que os argumentos sejam 2 números, porém que imprima se a soma é acima de 10, ou abaixo de 10."
red = 5
if red >= 1 and red <= 5
  p "red está entre 1 e 5"
else
  p "red não é nenhum dos anteriores"
end


Posso melhorar em alguma coisa?!

Exercícios Facieis

Laranjas

class Laranjas;
def laranja(x);

laranja = x

if laranja < 0
puts " você não tem nenhuma Laranja";
elsif laranja.between?(1,5);
puts " Voce tem #{laranja} Laranjas ";
elsif laranja == 6 then puts " Você tem meia duzia ";
elsif laranja.between?(7,11);
puts " Voce tem #{laranja} Laranjas ";
elsif laranja == 12 then puts " Você tem uma duzia ";
elsif laranja > 12;
puts " Voce tem #{laranja} Laranjas ";

end;
end;
end;

resultado = Laranjas.new
resultado.laranja(6)


Horas

class Tempo;
def horas;
hora = 23;
if hora % 2 == 1;
puts "ímpar";
else;
puts "par";
end;
end;
end;

resultado = Tempo.new
resultado.horas



Codigo Optimizado - Intermediario


case red = 4

when 1 
puts "red é 1"
 
when 2
puts "red é 2"
  
when 3
"red é 3"
    
else
puts "red nao é nenhum dos anteriores"

end


Programa de  Soma de 2 Algoritimos
class Matematica;
def soma(x,y);
soma = x + y;

if soma < 10;
puts " A soma e menor que 10 seu valor é #{soma}";
elsif soma > 10
puts " a soma e Maior que 10 seu valor é #{soma}";

end;
end;
end;

resultado = Matematica.new
resultado.soma(5,6)
resultado.soma(5,6)



Avançado


class Division;
def arg(x)
arg = [x]
divisivel  = "Divisivel por 3 "
ndivisivel = "Desculpe Não é divisivel por 3"

if arg.each{|chave,valor,retorno|puts"#{chave} => #{divisivel} e seu resultado é : #{chave/3}  " if chave%3==0}
if arg.each{|chave,valor|puts"#{chave} => #{ndivisivel}" unless chave%3==0}

end
end
end
end

resultado = Division.new 
resultado.arg(11)



Vou só responder a esse exercicio Mepps, das outras aulas nem preciso falar que está certo né shUAs xD.

Bom você manja a valer, nem tem tanta razão de eu corrigir algo rs, mas muito bem x], usou até um bloco para uma array, apesar que nem precisava de tanto x], anyway vlws por ter dado uma olhada na aula, tento fazer de um modo simples para ser entendível e claro, vamos movimentar essa área mais :D, boa sorte man.

Faltou corrigir o meu Raizen, que está acima do Mepps.