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.