quinta-feira, 28 de maio de 2015

Aula 28–Tomada de Decisão - IF

Olá pessoal hoje aprenderemos o nosso primeiro e principal função de decisão o IF que significa Se, com essa função podemos analisar determinada condição e seguir dois caminho um caso a condição seja verdadeira e  outro caso seja falsa.

Sintaxe:

(if <condições>
(<comando caso seja verdadeiro>)
(<comando caso seja falso>)
)

Note que na primeira linha abrimos um parênteses para o IF abrimos um parênteses colocamos a condição, mas não fechamos o parênteses pertencentes o IF, esse parêntese será fechado apenas no final.

Outra coisa muito importante a primeira linha é para se a condição for verdadeira e a segunda para falso, é exatamente isso uma única linha para cada, logo aprenderemos como usar mais linhas de programação dentro do if, o importante agora é entender que ele sozinho só trabalha com uma linha para falso e uma linha para verdadeiro.

Vamos ver alguns exemplo comentados:

Exemplo 1:

Vamos criar um comando onde o usuário digita o seu nome e a sua idade, caso a sua idade seja menor que 18 anos o programa emite uma mensagem de alerta informado que o usuário é menor de idade, caso seja maior de idade ele imprimira uma mensagem na linha de comando informando que o usuário é maior de idade.

(defun c:cad()
  (setq nome (getstring "\nDigite o seu primeiro nome: "))
  (setq idade (getint "nDigite a sua Idade: "))
  (if (< idade 18)
    (alert "ATENÇÃO o usuário é menor de idade.")
    (prompt "Usuário maior de idade, prossiga com seu cadastro.")
  )
  (princ)
  )

Apos o usuário digitar a sua idade e pressionar Enter o programa fara a analise da condição caso idade seja maior que 18 ele emitira uma mensagem de alerta na tela, se não ele emitira uma mensagem na linha de comando informando que esta tudo OK.

Note os parênteses em vermelho, eles mostram o inicio e o fim da função if.

Exemplo 2:

Nesse exemplo vamos aprender mais uma coisa interessante sobre o comando IF, vai acontecer varias vezes durante os seus programas a necessidade de informar o que o programa deve fazer apenas quando a condição for verdadeira e que o programa não faça nada se a condição for falsa.

No exemplo abaixo emitiremos a mensagem de alerta apenas se o usuário for menor de idade caso contrario não faremos nada, nesse caso basta suprimir a linha de comando caso a condição for falsa.

(defun c:cad2()
  (setq nome (getstring "\nDigite o seu primeiro nome: "))
  (setq idade (getint "nDigite a sua Idade: "))
  (if (< idade 18)
    (alert "ATENÇÃO o usuário é menor de idade.")
  )
  (princ)
  )

O mesmo não pode ser feito caso a condição for falsa, não podemos suprimir a linha de comando da condição verdadeira, uma forma de fazer isso é invertendo o operador logico, pois é diferente (< idade 18) e (> idade 18) isso mudara a ordem do que é falso e do que é verdadeiro.

Muito legal, porem na grande maioria das vezes uma única linha de programação não é o suficiente  para definir o que o usuário deve fazer caso seja verdadeira a condição ou caso seja falsa.
Para resolver esse problema devemos usar a seguinte sintaxe:

Sintaxe:

(if <condição>
    (progn
        <comando 1>
        <comando 2>
        <comando ……>
    )
   (progn
        <comando 1>
        <comando 2>
        <comando ……>
   )
)

Olhe bem o fechamento dos parênteses, eu os coloquei eles de cores diferentes, perceba onde começa e termina a função IF (parênteses vermelhos), depois temos a condição e depois abrimos um parênteses e escrevemos PROGN (note que o parênteses não é fechado no final do progn) abaixo do PROGN  você deve estar com toda a instrução caso a condição seja verdadeira e só depois fechar o parênteses do PROGN (parênteses amarelo e branco), caso tenhamos instruções a serem seguidas caso a condição seja falsa ai repetiremos o mesmo procedimento.

Vamos ver alguns exemplos:

Exemplo 1:

Vamos criar um programa que o usuário digite C para circulo ou qualquer coisa para linha (existe um comando melhor para fazer isso do que o getstring que não aprendemos ainda porque não valia a pena ensina-lo antes de aprender a tomada de decisão) se o usuário digitar C faremos um circulo no ponto selecionado no layer “circulo”, se ele digitar qualquer outra coisa o programa fara uma linha no layer linha.

(defun c:lc()
  (setq tipo (getstring "\Para circulo C para linha qualquer coisa: "))
  (if (or (= tipo "c") (= tipo "C"))
    (progn
      (setq pt1 (getpoint "\nClique sobre o ponto desejado: "))
      (setq raio (getreal "\nDigite o raio do circulo: "))
      (command "circle" pt1 raio)
      (command "layer" "n" "circulo" "c" "7" "circulo" "")
      (command "chprop" (entlast) "" "la" "circulo" "")
      )
    (progn
      (setq pt1 (getpoint "\nClique no primeiro ponto: "))
      (setq pt2 (getpoint pt1 "\nClique no segundo ponto: "))
      (command "line" pt1 pt2 "")
      (command "layer" "n" "linha" "c" "7" "linha" "")
      (command "chprop" (entlast) "" "la" "linha" "")
      )    )
  (princ)
  )

Agora fica mais fácil, temos dois blocos de programa que só serão executados se a condição for verdadeira ou falsa, note que a condição foi feita usando o operador logico OR ele vai executar como circulo se o usuário digitar c (minúsculo) ou C (maiúsculo), como ainda não aprendemos o tratamento de string temos que fazer assim para dar certo.

O bloco de programação em amarelo será executado for verdadeira a condição e o bloco de programação em verdade será executada se a condição for falsa.

Da mesma forma podemos ter apenas um bloco de informação para caso a condição seja verdadeira não sendo necessário escrever o bloco de programação caso seja falso.

No exemplo Abaixo temos o mesmo programa porem ele somente fara o circulo se for pressionado o C ou c, porém nada será feito se qualquer outra tecla for pressionada.

Exemplo 2:

(defun c:lc2()
  (setq tipo (getstring "\Para circulo C: "))
  (if (or (= tipo "c") (= tipo "C"))
    (progn
      (setq pt1 (getpoint "\nClique sobre o ponto desejado: "))
      (setq raio (getreal "\nDigite o raio do circulo: "))      (command "circle" pt1 raio)      (command "layer" "n" "circulo" "c" "7" "circulo" "")      (command "chprop" (entlast) "" "la" "circulo" "")      )
    )
  (princ)
  )

   
Só teremos agora o bloco de programação amarelo, caso a condição seja verdadeira, caso o usuário digite qualquer coisa diferente de C ou c o programa não fara nada

Aproveitando esse exemplo vou explicar outra coisas, é possível misturar um if com progn caso seja verdadeira a condição e uma única linha caso seja falso, ou vice versa.

Exemplo 3:

(defun c:lc3()
  (setq tipo (getstring "\Para circulo C: "))
  (if (or (= tipo "c") (= tipo "C"))
   (progn
      (setq pt1 (getpoint "\nClique sobre o ponto desejado: "))      (setq raio (getreal "\nDigite o raio do circulo: "))      (command "circle" pt1 raio)      (command "layer" "n" "circulo" "c" "7" "circulo" "")      (command "chprop" (entlast) "" "la" "circulo" "")      )
    (prompt "\nNenhuma opção válida foi escolhida.")
    )
  (princ)
  )

Note que temos um bloco de programação caso seja verdadeiro (em amarelo) e apenas uma linha caso seja falso, nesse caso apenas uma mensagem será impressa na linha de comando. O mesmo pode acontecer de termos uma linha caso a condição seja verdadeira e um bloco de programação caso seja falso.

Na aula 30 quando fizermos exercícios comentado, vamos aprender a trabalhar com IF alinhados que serão tomadas de decisão uma dentro da outra, falaremos disso no exercício em vídeo aula pois ficara mais fácil

Abaixo segue o link dessa vídeo aula em meu canal manual de Cad no youtube.

https://www.youtube.com/watch?v=hJigRvlObTs&feature=youtu.be

Espero que tenham gostado

Sergio Fernandes

Manual de Cad. 

Nenhum comentário:

Postar um comentário